Agence web » Actualités du digital » Vérifier une valeur dans une base de données MySQL à partir d'un script Linux Bash

Vérifier une valeur dans une base de données MySQL à partir d'un script Linux Bash

Vous pouvez faire exécuter vos scripts bash différemment en fonction du contenu d'une base de données MySQL en vous y connectant à partir de la ligne de commande et en passant une requête, que vous pouvez utiliser dans if blocs à créer des branches en fonction d'une valeur.

Remarque: Nos exemples montrent l'utilisation de l'utilisateur root sur MySQL, mais vous voudrez y substituer un autre compte d'utilisateur.

Exécuter des requêtes SQL à partir d'un script Bash

La syntaxe pour exécuter dans un script bash est la même que pour accéder à une base de données à partir de la ligne de commande:

mysql -u root -pPassword -h hostname -D dbname -e 'query'

Si votre base de données s'exécute localement, vous pouvez omettre -h drapeau. Si vous exécutez une base de données de développement, vous pouvez omettre le -p indicateur si votre base de données n'a pas de mot de passe.

Cela affichera les résultats de la requête vers STDOUT, que vous pouvez diriger vers un fichier:

mysql -u root -D dbname -e 'SELECT * FROM table' > file

… Ou stocker dans une variable avec le $( ) construction:

variable=$(mysql -u root -D dbname -e 'SELECT * FROM table')

Mais le résultat ne sera pas très joli par défaut, vous pouvez donc le rendre plus facile à travailler en utilisant le -B drapeau pour imprimer au format TSV (Tab Separated Values) et le -N indicateur pour omettre les en-têtes de colonne.

Les fichiers TSV sont le cousin le moins utilisé des fichiers CSV, que vous pouvez convertir à partir de la ligne de commande.

Vérification d'une valeur spécifique et d'un branchement

Si vous souhaitez créer une branche en fonction d'une valeur de votre base de données, vous pouvez rechercher la ligne et la colonne spécifiques et stocker la réponse dans une variable. Vous pouvez ensuite utiliser un bash if bloc à branche en fonction du contenu de cette variable.

field=$(mysql -u root -BNe 'USE test; SELECT label FROM test WHERE id=1')

if ( $field == 'TEST' ); then
    //do stuff
fi

Cela ne fonctionne que lorsque vous demandez une valeur spécifique et effectuez une simple comparaison. Si vous avez besoin de plus de manipulation que ce que fournit bash, vous pouvez utiliser awk, qui peut sélectionner des colonnes individuelles dans le texte et effectuer des comparaisons:

if ( $(echo $field | awk '{if ($1 == value && $2 == value2) print 1; else print 0}') == "1" ); then
    //do stuff
fi

Ici le awk La commande affiche vrai ou faux (1 ou 0), que le bash if peut utiliser pour comparer et créer une branche.

Ces deux exemples supposent que votre requête SQL ne renvoie qu'une seule ligne, ce que vous pouvez garantir en sélectionnant en fonction de l'ID. Mais si vous exécutez une requête plus complexe, vous souhaiterez peut-être limiter la réponse à la première ligne avec la commande SQL LIMIT 1.

Vérification des erreurs: vérifier si une base de données ou une table existe

Bien que vous écriviez probablement ce script spécifiquement pour votre serveur, un peu de vérification des erreurs n'a jamais fait de mal à personne. Vous voudrez vérifier que la base de données et les tables avec lesquelles vous travaillerez existent réellement avant de les manipuler. De plus, si la connexion à la base de données ne fonctionne pas, cela entraînera également une erreur.

La commande SQL 'USE dbname' produira une erreur si dbname n'existe pas (code retour> 0). Vous pouvez l'utiliser dans un if bloquer pour vérifier si la base de données est correctement configurée:

if mysql -u root -e 'USE mydbname'; then
  
    //database exists, do stuff

fi

Vous pouvez inverser le if bloquer en commençant le booléen avec un !, qui exécutera le code uniquement lorsque la base de données n'est pas configurée, ce qui est utile pour la première configuration.

De même, vous pouvez vérifier si des tables existent en essayant d'accéder à la première ligne:

if mysql -u root -e 'USE mydbname; SELECT * FROM tablename LIMIT 1'; then

   //database and table exist, do more stuff

fi

Parce que le if block vérifie le code de retour de la commande que vous y insérez, et les commandes MySQL renverront un code d'erreur si elles rencontrent des problèmes, vous pouvez utiliser n'importe quelle commande dans un if bloquer pour tenir compte des erreurs.

★★★★★