web-dev-qa-db-fra.com

Stocker la sortie de la requête mysql dans une variable shell

J'ai besoin d'une variable pour conserver les résultats extraits de la base de données. Jusqu'à présent, c'est ce que j'essaye sans succès.

myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a)

Ma compréhension des commandes bash n’est pas très bonne, comme vous pouvez le constater.

34
imnotneo

Je ne connais pas grand chose à propos de l’interface de ligne de commande MySQL, mais en supposant que vous n’ayez besoin que d’aide pour le bashing, vous devriez essayer d’échanger les commandes de la manière suivante:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password)

qui fait écho la chaîne dans MySQL. Ou, vous pouvez être plus sophistiqué et utiliser de nouvelles fonctionnalités bash (la chaîne here)

myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a")

aboutissant à la même chose (en supposant que vous utilisez une version assez récente de bash), sans impliquer d’écho.

Notez que le mot de passe -p $ n'est pas une faute de frappe, mais constitue le moyen par lequel MySQL s'attend à ce que les mots de passe soient entrés via la ligne de commande (sans espace entre l'option et la valeur).

Notez que myvariable contiendra tout ce que MySQL affiche en sortie standard (généralement tout sauf les messages d'erreur), y compris tous les en-têtes de colonnes, les cadres de travail ASCII, etc., qui peuvent être ou non ce que vous voulez.

MODIFIER:
Comme cela a été noté, il semble y avoir un paramètre -e dans MySQL, je choisirais celui-là, définitivement.

42
falstro

Une manière plus directe serait:

myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a")
53
ennuikiller

Pour lire les données ligne par ligne dans un tableau de Bash, vous pouvez procéder comme suit:

while read -a row
do
    echo "..${row[0]}..${row[1]}..${row[2]}.."
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password)

Ou en variables individuelles:

while read a b c
do
    echo "..${a}..${b}..${c}.."
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password)
15
Dennis Williamson

Vous avez le tuyau en sens inverse et vous devez faire écho à la requête, comme ceci:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql db -u $user -p $password)

Une autre alternative consiste à utiliser uniquement le client mysql, comme ceci

myvariable=$(mysql db -u $user -p $password -se "SELECT A, B, C FROM table_a")

(-s est requis pour éviter l'art ASCII)

Maintenant, BASH n'est pas le langage le plus approprié pour gérer ce type de scénario, en particulier la gestion des chaînes et le fractionnement des résultats SQL, etc. Vous devez travailler beaucoup pour obtenir des choses très simples en Perl, Python ou PHP.

Par exemple, comment obtiendrez-vous chacun de A, B et C avec leur propre variable? C'est certainement faisable, mais si vous ne comprenez pas les pipes et l'écho (ce qui est très basique chez Shell), ce ne sera pas une tâche facile à faire. Si possible, j'utiliserais un langage mieux adapté.

12
Vinko Vrsalovic

Si vous voulez utiliser une seule valeur dans bash, utilisez:

  companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1)

  echo "$companyid"
7
Isidoros
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a)

sans l'espace vide après -p. C'est trivial, mais sans ne fonctionne pas. 

3
puchrojo

Si vous avez un nom de base de données particulier et un hôte sur lequel vous voulez que la requête soit exécutée, suivez la requête ci-dessous:

outputofquery=$(mysql -u"$dbusername" -p"$dbpassword" -h"$dbhostname" -e "SELECT A, B, C FROM table_a;" $dbname)

Donc, pour exécuter les requêtes mysql, vous devez installer le client mysql sur linux

1
Tamgale Prasad

Un autre exemple lorsque le nom de la table ou la base de données contient des caractères non pris en charge, tels qu'un espace ou '-'

db='data-base'

db_d=''
db_d+='`'
db_d+=$db
db_d+='`'

myvariable=`mysql --user=$user --password=$password -e "SELECT A, B, C FROM $db_d.table_a;"`
0
Sanya Snex
myvariable=$(mysql -u user -p'password' -s -N <<QUERY_INPUT
    use databaseName;
    SELECT fieldName FROM tablename WHERE filedName='fieldValue';
QUERY_INPUT
)
echo "myvariable=$myvariable"
0
Dima