Сохранение вывода запроса MySQL в переменную оболочки
Мне нужна переменная для хранения результатов, полученных из базы данных. Пока это в основном то, что я стараюсь без успеха.
myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a)
Мое понимание команд bash не очень хорошо, как вы можете видеть.
Ответы
Ответ 1
Я мало знаю о интерфейсе командной строки MySQL, но, предполагая, что вам нужна только помощь в bashing, вы должны попытаться либо поменять команды так:
myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password)
который выводит строку в MySQL. Или вы можете быть более причудливыми и использовать некоторые новые bash -features (здесь строка)
myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a")
что приводит к тому же (предполагается, что вы используете достаточно недавнюю версию bash) без включения эха.
Обратите внимание, что пароль -p $не является опечаткой, но так как MySQL ожидает ввода паролей через командную строку (без пробела между опцией и значением).
Обратите внимание, что myvariable будет содержать все, что MySQL выводит на стандартном (обычно все, кроме сообщений об ошибках), включая любые заголовки столбцов, рамки ASCII-art и т.д., которые могут быть или не быть тем, что вы хотите.
EDIT:
Как уже отмечалось, для MySQL, по-видимому, есть параметр -e
, я бы выбрал именно этот вариант.
Ответ 2
Более прямой способ:
myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a")
Ответ 3
Чтобы прочитать данные по строкам в массив 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)
Ответ 4
У вас есть канал наоборот, и вам нужно выполнить эхо-запрос, например:
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 в своей переменной? Это, безусловно, выполнимо, но если вы не понимаете труб и эхо (очень простой материал оболочки), вам не составит легкой задачи, поэтому, если это вообще возможно, я бы использовал более подходящий язык.
Ответ 5
Если вы хотите использовать одно значение в bash, используйте:
companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1)
echo "$companyid"
Ответ 6
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a)
без пробела после -p
. Его тривиально, но без работы.
Ответ 7
Если у вас есть конкретное имя базы данных и хост, на котором вы хотите выполнить запрос, выполните следующий запрос:
outputofquery=$(mysql -u"$dbusername" -p"$dbpassword" -h"$dbhostname" -e "SELECT A, B, C FROM table_a;" $dbname)
Поэтому для запуска запросов mysql вам необходимо установить клиент mysql в linux
Ответ 8
myvariable=$(mysql -u user -p'password' -s -N <<QUERY_INPUT
use databaseName;
SELECT fieldName FROM tablename WHERE filedName='fieldValue';
QUERY_INPUT
)
echo "myvariable=$myvariable"
Ответ 9
Другой пример, когда имя таблицы или базы данных содержит неподдерживаемые символы, такие как пробел или '-'
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;"'