web-dev-qa-db-fra.com

Comment alimenter les requêtes mysql depuis bash

J'essaye de faire un script bash qui crée un utilisateur et une base de données mysql mais je ne peux pas trouver un moyen d'alimenter le sql en mysql, j'essaie avec ce format:

mysql < echo "query"

Mais cela ne fonctionne pas, voir l'exemple ci-dessous:

mysql --Host=localhost --user=user --password=password < echo "CREATE USER 'testuser'@'localhost' IDENTIFIED BY  'jakdJxct8W';
CREATE DATABASE IF NOT EXISTS 'testuser_dev' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
GRANT ALL PRIVILEGES ON  'testuser_dev' . * TO  'testuser'@'localhost';
CREATE DATABASE IF NOT EXISTS 'testuser_qa' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
GRANT ALL PRIVILEGES ON  'testuser_qa' . * TO  'testuser'@'localhost';"

Comment nourrir mysql avec les requêtes?

28
tirithen

Essayez comme ceci:

echo "select 1" | mysql
37
mysql --batch --silent -e 'SHOW TABLES';

Batch et silent sont pratiques si vous prévoyez de diriger la sortie

24
Ken

Essayez d'utiliser un ici document comme ceci:

mysql --Host=localhost --user=user --password=password << END

CREATE USER 'testuser'@'localhost' IDENTIFIED BY  'jakdJxct8W';
CREATE DATABASE IF NOT EXISTS 'testuser_dev' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
GRANT ALL PRIVILEGES ON  'testuser_dev' . * TO  'testuser'@'localhost';
CREATE DATABASE IF NOT EXISTS 'testuser_qa' DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
GRANT ALL PRIVILEGES ON  'testuser_qa' . * TO  'testuser'@'localhost';

END

Vous pouvez également placer toutes vos commandes dans un fichier texte et l'exécuter:

mysql --Host=localhost --user=user --password=password < commands.sql
23
dogbane

La raison pour laquelle votre tentative n'a pas fonctionné est que le < attend un nom de fichier et vous lui avez donné une chaîne. Il faudrait faire quelque chose comme

echo "YOURQUERYSTRINGHERE">tmpfile
mysql --Host=localhost --user=user --password=password dbname <tmpfile

la suggestion de ken de

 mysql  --Host=localhost --user=user --password=password -e "QUERY" dbname

peut fonctionner, mais si vous essayez d'utiliser des variables bash dans votre requête, vous pouvez tomber dans l'expansion des paramètres. par exemple

QUERY="select * from $MYTABLE WHERE name=\"[email protected]\";"
mysql --Host=localhost --user=user --password=password -e "$QUERY" mydbname

peut ne pas faire ce que vous attendez. Une option est d'utiliser

echo "$QUERY"|mysql --Host=localhost --user=user --password=password mydbname

qui fonctionne si la chaîne de requête contient des guillemets appropriés. Une autre option est le document "ici" comme suggéré par dogbane.

11
tim

As-tu essayé mysql -e query?

7
Sorrow

Pour les grandes requêtes dans un script bash, vous pouvez essayer:

read -d '' SQL_QUERY_1 << EOF

SELECT prod.id as id, prod.title as title, comp.name as company, pho.id as photo_id, pho.image as photo_name
FROM products as prod
JOIN accounts as comp
ON comp.id = prod.account_id
JOIN photos as pho
ON pho.id = prod.featured_photo_id;

EOF

echo ${SQL_QUERY_1} | mysql
0
Daniel Pérez Rada