web-dev-qa-db-fra.com

Utilisation du script Shell pour insérer des données dans la base de données MYSQL distante

J'ai essayé d'obtenir un script Shell (bash) pour insérer une ligne dans une base de données REMOTE, mais j'ai eu quelques problèmes :(

Le script est destiné à télécharger un fichier sur un serveur, à obtenir une URL, un HASH et une taille de fichier, à se connecter à une base de données mysql distante et à insérer les données dans une table existante. Je l'ai fait fonctionner jusqu'au bit de base de données MYSQL distant.

Cela ressemble à ceci:

#!/bin/bash

zxw=randomtext
description=randomtext2

for file in "$@"
 do
 echo -n *****
 ident= *****
 data= ****
 size=` ****
 hash=`****
mysql --Host=randomhost --user=randomuser --password=randompass randomdb
insert into table (field1,field2,field3) values('http://www.site.com/$hash','$file','$size');
echo "done"
done

Je suis un noob total à la programmation alors oui: P

Quoi qu'il en soit, j'ai ajouté le\pour échapper aux crochets car je recevais des erreurs. Comme c'est le cas actuellement, le script fonctionne correctement jusqu'à ce qu'il se connecte à la base de données mysql. Il se connecte simplement à la base de données mysql et ne fait pas la commande d'insertion (et je ne sais même pas si la commande d'insertion fonctionnerait en bash).

PS: J'ai essayé les deux commandes mysql à partir de la ligne de commande une par une, et elles ont fonctionné, même si j'ai défini le hachage/fichier/taille et que je n'avais pas le "\" d'échappement.

Quoi qu'il en soit, qu'en pensez-vous? Ce que j'essaie de faire est-il même possible? Si c'est le cas, comment?

Toute aide serait appréciée :)

15
Amir

L'instruction d'insertion doit être envoyée à mysql, pas à une autre ligne du script Shell, vous devez donc en faire un "document ici".

mysql --Host=randomhost --user=randomuser --password=randompass randomdb << EOF
insert into table (field1,field2,field3) values('http://www.site.com/$hash','$file','$size');
EOF

Le << EOF signifie prendre tout avant la ligne suivante qui ne contient que EOF (pas d'espace au début) comme entrée standard du programme.

29
Paul Tomblin

Ce n'est peut-être pas exactement ce que vous recherchez, mais c'est une option.

Si vous voulez contourner l'ennui d'inclure réellement votre requête dans le script sh, vous pouvez enregistrer la requête en tant que fichier .sql (utile parfois lorsque la requête est VRAIMENT grande et compliquée). Cela peut être fait avec un simple fichier IO dans la langue que vous utilisez.

Ensuite, vous pouvez simplement inclure dans votre script sh quelque chose comme:

mysql -u youruser -p yourpass -h remoteHost < query.sql &

C'est ce qu'on appelle l'exécution en mode batch. Facultativement, vous pouvez inclure l'esperluette à la fin pour vous assurer que cette ligne du script sh ne se bloque pas.

De plus, si vous craignez que les mêmes données soient entrées plusieurs fois et que vos rdbms deviennent incohérents, vous devriez explorer les transactions MySql (validation, restauration, etc.).

11
kmarks2

N'utilisez pas le SQL brut de bash; bash n'a aucune facilité raisonnable pour nettoyer les données à l'avance. Générez un fichier CSV et téléchargez-le à la place.

5