Сохранение вывода запроса MySQL в переменную оболочки - PullRequest
34 голосов
/ 28 октября 2009

Мне нужна переменная для хранения результатов, извлеченных из базы данных. Пока это в основном то, что я пытаюсь безуспешно.

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

Мое понимание команд bash не очень хорошее, как вы можете видеть.

Ответы [ 9 ]

56 голосов
/ 28 октября 2009

Более прямой путь будет:

myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a")
43 голосов
/ 28 октября 2009

Я не очень разбираюсь в интерфейсе командной строки MySQL, но, предполагая, что вам нужна только помощь с обработкой ошибок, вам следует попробовать поменять местами команды следующим образом:

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

, который выводит строку в MySQL. Или вы можете быть более изощренным и использовать некоторые новые функции bash (строка here)

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

В результате получается то же самое (при условии, что вы используете достаточно свежую версию bash), без использования echo.

Обратите внимание, что -p $ пароль не является опечаткой, но MySQL ожидает, что пароли будут вводиться через командную строку (без пробела между опцией и значением).

Обратите внимание, что myvariable будет содержать все, что MySQL выводит на стандартный вывод (обычно все, кроме сообщений об ошибках), включая любые и все заголовки столбцов, фреймы ASCII-art и т. Д., Что может или не может быть тем, что вы хотите.

EDIT:
Как уже отмечалось, в MySQL, похоже, есть параметр -e, я бы определенно пошел на него.

15 голосов
/ 28 октября 2009

Чтобы прочитать данные построчно в массив Bash, вы можете сделать это:

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)

Или на отдельные переменные:

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)
12 голосов
/ 28 октября 2009

У вас есть канал, и вам нужно повторить запрос, например:

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

Другой альтернативой является использование только клиента mysql, например

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

(-s требуется, чтобы избежать ASCII-искусства)

Теперь BASH - не самый подходящий язык для обработки сценариев такого типа, особенно для обработки строк, разделения результатов SQL и тому подобного. Вы должны много работать, чтобы получить вещи, которые были бы очень и очень просты в Perl, Python или PHP.

Например, как вы получите каждый из A, B и C по своей переменной? Это, конечно, выполнимо, но если вы не понимаете pipe и echo (очень простые вещи оболочки), вам будет нелегко выполнить эту задачу, поэтому, если это вообще возможно, я бы использовал более подходящий язык.

8 голосов
/ 17 апреля 2013

Если вы хотите использовать одно значение в bash:

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

  echo "$companyid"
3 голосов
/ 16 декабря 2011
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a)

без пробела после -p. Это тривиально, но без не работает.

2 голосов
/ 27 февраля 2018

Если у вас есть конкретное имя базы данных и хост, на котором вы хотите выполнить запрос, следуйте приведенному ниже запросу:

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

Таким образом, для запуска запросов mysql вам нужно установить клиент mysql в linux

0 голосов
/ 03 февраля 2018

Другой пример, когда имя таблицы или базы данных содержит неподдерживаемые символы, например пробел, или '-'

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 голосов
/ 17 августа 2012
myvariable=$(mysql -u user -p'password' -s -N <<QUERY_INPUT
    use databaseName;
    SELECT fieldName FROM tablename WHERE filedName='fieldValue';
QUERY_INPUT
)
echo "myvariable=$myvariable"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...