Как кормить MySQL запросы от Bash - PullRequest
28 голосов
/ 27 мая 2011

Я пытаюсь создать скрипт bash, который создает пользователя и базу данных mysql, но я не могу найти способ передать sql в mysql, я пытаюсь использовать этот формат:

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 с запросами?

Ответы [ 6 ]

37 голосов
/ 27 мая 2011

Попробуй так:

echo "select 1" | mysql
24 голосов
/ 27 мая 2011
mysql --batch --silent -e 'SHOW TABLES';

Пакетная и беззвучная настройки удобны, если вы планируете передать вывод

23 голосов
/ 27 мая 2011

Попробуйте использовать здесь документ вот так:

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
11 голосов
/ 07 августа 2015

Причина, по которой ваша попытка не сработала, заключалась в том, что < ожидает имя файла, и вы передали ему строку.Вам нужно будет сделать что-то вроде

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=\"silly@place.com\";"
mysql --host=localhost --user=user --password=password -e "$QUERY" mydbname

может не соответствовать вашим ожиданиям.Одним из вариантов является использование

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

, которое работает, если строка запроса содержит соответствующие кавычки.Другой вариант - это документ «здесь», предложенный Dogbane.

7 голосов
/ 27 мая 2011

Вы пробовали mysql -e query?

0 голосов
/ 19 октября 2017

Для больших запросов в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...