web-dev-qa-db-ja.com

bashからmysqlクエリをフィードする方法

Mysqlユーザーとデータベースを作成するbashスクリプトを作成しようとしていますが、mysqlにsqlをフィードする方法を見つけることができません。この形式で試しています:

mysql < echo "query"

しかし、それは機能していません。以下の例を参照してください。

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';"

Mysqlにクエリをフィードする方法は?

28
tirithen

このようにしてみてください:

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

出力をパイプ処理する場合は、バッチとサイレントが便利です

24
Ken

次のような here document を使用してみてください。

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

または、すべてのコマンドをテキストファイルに配置して実行します。

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

試みが機能しなかった理由は、<はファイル名を期待し、それに文字列を渡しました。あなたは次のようなことをしなければなりません

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

ケンの提案

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

動作しますが、クエリでbash変数を使用しようとすると、パラメーター展開のファウルに陥ることがあります。例えば

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

あなたが期待することをしないかもしれません。 1つのオプションは使用です

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

クエリ文字列に適切な引用符が含まれている場合に機能します。別のオプションは、dogbaneによって提案された「here」ドキュメントです。

11
tim

やってみました mysql -e query

7
Sorrow

Bashスクリプトでの大きなクエリの場合、次を試すことができます。

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