Подтвердить что ты не робот

Сохранение вывода запроса MySQL в переменную оболочки

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

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

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

4b9b3361

Ответ 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;"'