tirithen
tirithen

Reputation: 3517

How to feed mysql queries from bash

I'm trying to make a bash script that creates a mysql user and database but I can't find a way to feed the sql into mysql, I'm trying with this format:

mysql < echo "query"

But that is not working, see the example below:

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

How to feed mysql with the queries?

Upvotes: 40

Views: 67653

Answers (7)

willgriffin
willgriffin

Reputation: 11

cat <<EOD | mysql [-u user] [-ppassword] [database]
  select 1;
  select 2;
  select 3;
EOD

in your case

cat <<EOD | mysql -u root -p
    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";
    FLUSH PRIVILEGES;
EOD

Upvotes: 1

Daniel P&#233;rez Rada
Daniel P&#233;rez Rada

Reputation: 1561

For big queries in a bash script, you can try:

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

Upvotes: 0

tim
tim

Reputation: 121

The reason your attempt did not work was because the < expects a file name and you fed it a string. You would have to do something like

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

ken's suggestion of

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

can work, but if you try to use bash variables in your query you can fall foul of parameter expansion. eg

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

may not do what you expect. One option is use

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

which works if the query string contains appropriate quoting. Another option is the "here" document as suggested by dogbane.

Upvotes: 12

Prince John Wesley
Prince John Wesley

Reputation: 63698

Try like this:

echo "select 1" | mysql

Upvotes: 58

Ken
Ken

Reputation: 78852

mysql --batch --silent -e 'SHOW TABLES';

Batch and silent are handy if you are planning to pipe the output

Upvotes: 26

dogbane
dogbane

Reputation: 274622

Try using a here document like this:

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

Alternatively place all you commands in text file and run it:

mysql --host=localhost --user=user --password=password < commands.sql

Upvotes: 30

Miki
Miki

Reputation: 7188

Have you tried mysql -e query?

Upvotes: 8

Related Questions