J'ai un script bash que j'utilise pour faire une boucle et traiter les résultats d'une requête SQL comme celle-ci.bash: code de retour de la commande d'entrée redirigée
while read field1 field2 field3 field4
do
{...something here...}
done < <(mysql -h $HOST -u $USER -p"$PASS" $DB << EOF
{...multi-line select query here...}
EOF)
Le problème que je ne sais pas comment résoudre est comment puis-je Refactor ce que je peux obtenir le code de retour, l'erreur et sauter sur la boucle en cas de problème interrogation la base de données?
Edit:
J'ai essayé d'utiliser un tube nommé avec ce qui suit.
mkfifo /tmp/mypipe
mysql -h $HOST -u $USER -p"$PASS" $DB <<EOF>> /tmp/mypipe
{...multi-line select query here...}
EOF
echo $?
{...loop here...}
Cela ne semble pas fonctionner parce que la commande MySQL est assis et attend le tuyau à lire avant de continuer. Donc, à moins que je n'aie quelque chose à lire, mysql ne sortira pas pour avoir un code de retour.
J'ai essayé de stocker les résultats de la requête dans une variable d'abord avec ce qui suit.
DATADUMP=$(mysql -h $HOST -u $USER -p"$PASS" $DB -e \
'select stuff from place \
join table 1 on record ..... \
')
La question que je suis tombé sur c'est la boucle de lecture ne ferait que lire les quatre premiers « mots » de la variable DataDump et ignorerait le reste.
À ce stade, à moins que quelqu'un ne revienne avec une idée géniale, je vais mktemp un fichier temporaire pour contenir les résultats de la requête. J'espérais éviter de constamment lire et écrire sur le disque, mais mon délai approche très rapidement.
Lorsque mysql échoue, obtenez-vous une sortie que la boucle voit? Est-ce que vous êtes seulement intéressé dans le cas où la boucle ne court jamais? Ou pouvez-vous obtenir des données partielles mais la commande échoue-t-elle? Si ce dernier (ou vous voulez le code de retour spécifiquement et pas simplement "il a échoué") alors vous devrez peut-être utiliser un fifo afin que vous puissiez exécuter mysql séparément et écrire dessus, puis en lire plus tard (ou quelque chose comme ça). –
Je dirais alors, juste "sauter" pourrait ne pas être suffisant. Tant que la cohérence est importante et qu'il ne s'agit pas de DDL, faites des transactions. En outre, il peut arriver que bash ne soit pas un meilleur choix pour cela. Comme: combiner des requêtes dans un fichier (avec gestion des transactions si possible), puis exécuter. –
Lorsque mysql échoue, quelle que soit sa sortie, elle est traitée par la boucle. – Jeremy