Author Topic: Bash + SQL  (Read 10568 times)

0 Members and 1 Guest are viewing this topic.

Offline lsk

  • Newbie
  • *
  • Posts: 26
  • Karma: +0/-0
Bash + SQL
« on: June 02, 2006, 14:33:18 »
Час добрый всем!
Вопросик возник небольшой, может кто имел с этим дело..
Так вот, можно ли скриптом на Bash'е забрать информацию с MySQL (значение одного из полей) или несколько полей. К примеру, если в одном поле стоит 1, то с другого забрать адрес IP и положить в файл, иначе удалить из файлика IP адрес?
заранее благодарен

Offline Satan

  • Jr. Member
  • **
  • Posts: 74
  • Karma: +0/-0
  • qrcode
Bash + SQL
« Reply #1 on: June 02, 2006, 15:44:44 »
Quote from: lsk
Час добрый всем!
Вопросик возник небольшой, может кто имел с этим дело..
Так вот, можно ли скриптом на Bash'е забрать информацию с MySQL (значение одного из полей) или несколько полей. К примеру, если в одном поле стоит 1, то с другого забрать адрес IP и положить в файл, иначе удалить из файлика IP адрес?
заранее благодарен

mysql db -e 'mysqlquerry'

mysql test -e 'SELECT * FROM tab' например - в шеле получишь вывод - что с ним делать решать тебе и писать уже на sh

Offline lsk

  • Newbie
  • *
  • Posts: 26
  • Karma: +0/-0
Bash + SQL
« Reply #2 on: June 02, 2006, 23:33:20 »
короче так не прокатило, я немного поменял:

Code: [Select]
#!/bin/sh

mysql -h localhost  -u root  -p db_test --password=******
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
mysql QUIT

так вот, соединяется просто отлично с базой, но выдает
./sqlbash: line 5: check: command not found
./sqlbash: line 5: user: command not found
./sqlbash: line 5: check: command not found
почему же не sql свои команды смотрит?
как сделать так, чтобы он просматривал после соединения строку, начинающуюся с mysql> ..далее SELECT `ip`, `check` FROM `user` WHERE `check`=1;

просто этот запрос в самом sql отрабатывается на ура

Offline demiurg

  • Hero Member
  • *****
  • Posts: 1014
  • Karma: +0/-0
    • http://larin.tomsk.ru
Bash + SQL
« Reply #3 on: June 03, 2006, 00:02:34 »
Quote from: lsk
короче так не прокатило, я немного поменял:

Code: [Select]
#!/bin/sh

mysql -h localhost  -u root  -p db_test --password=******
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
mysql QUIT

так вот, соединяется просто отлично с базой, но выдает
./sqlbash: line 5: check: command not found
./sqlbash: line 5: user: command not found
./sqlbash: line 5: check: command not found
почему же не sql свои команды смотрит?
как сделать так, чтобы он просматривал после соединения строку, начинающуюся с mysql> ..далее SELECT `ip`, `check` FROM `user` WHERE `check`=1;

просто этот запрос в самом sql отрабатывается на ура
А может все таки документацию по mysql и по bash почитать.
Естественно, что это баш пытается выполнить скрипт по строчно, нужно писать в одной строке и не забыть ключик -e.
Или Вы думаете, что волшебным образом управление перейдет от баша к mysql и дальше скрипт будет интерпретировать mysql?
Вероятнее выглядеть должно так
Code: [Select]
RESULT=`mysql -h localhost  -u root  -D db_test --password=****** -e "SELECT `ip`, `check` FROM `user` WHERE `check`=1;"`$RESULT содержит результат и с ним можно работать дальше.
Я бы конечно не насиловал себя башем, а написал скрипт на перле.
« Last Edit: June 03, 2006, 00:06:07 by demiurg »

Offline lsk

  • Newbie
  • *
  • Posts: 26
  • Karma: +0/-0
Bash + SQL
« Reply #4 on: June 03, 2006, 00:29:35 »
хм, да чего только я уже не пробывал и встрочку и "в столбик" все уже пробывал и -e и другие ключи, все равно баш "думает", что это его команды
вот что ваша строчка выдает с использованием моих данных:
./sqlbash: command substitution: line 7: unexpected EOF while looking for matchi
ng `"'
./sqlbash: command substitution: line 8: syntax error: unexpected end of file
./sqlbash: line 7: ,: command not found
./sqlbash: line 7: FROM: command not found
./sqlbash: line 7: WHERE: command not found
./sqlbash: command substitution: line 7: unexpected EOF while looking for matchi
ng `"'
./sqlbash: command substitution: line 8: syntax error: unexpected end of file

Offline lamaka

  • Jr. Member
  • **
  • Posts: 51
  • Karma: +0/-0
Bash + SQL
« Reply #5 on: June 03, 2006, 01:49:23 »
что-то мне подсказывает что строчка неправильно приведена.

Offline mikk

  • Newbie
  • *
  • Posts: 5
  • Karma: +0/-0
Bash + SQL
« Reply #6 on: June 03, 2006, 12:00:03 »
lsk, а может имена столбцов надо в кавычки брать? А не использовать символ `. При обрамлении этим символом bash пытается выполнить несуществующую команду с именем столбца, и подставить в строку результат выполнения.

Offline demiurg

  • Hero Member
  • *****
  • Posts: 1014
  • Karma: +0/-0
    • http://larin.tomsk.ru
Bash + SQL
« Reply #7 on: June 03, 2006, 12:11:07 »
Quote from: mikk
lsk, а может имена столбцов надо в кавычки брать? А не использовать символ `. При обрамлении этим символом bash пытается выполнить несуществующую команду с именем столбца, и подставить в строку результат выполнения.
Да, я как-то не обратил внимание на то, что там апострофы "обратные", тут два выхода -- или заменить их прямыми или заключить команду в одинарные кавычки
Code: [Select]
RESULT=`mysql -h localhost  -u root  -D db_test --password=****** -e 'SELECT `ip`, `check` FROM `user` WHERE `check`=1;'`За подробным объяcнением фокуса с "" и '' отправляю в man bash
« Last Edit: June 03, 2006, 12:12:08 by demiurg »

Offline Satan

  • Jr. Member
  • **
  • Posts: 74
  • Karma: +0/-0
  • qrcode
Bash + SQL
« Reply #8 on: June 03, 2006, 14:29:49 »
Quote from: lsk
короче так не прокатило, я немного поменял:

Code: [Select]
#!/bin/sh

mysql -h localhost  -u root  -p db_test --password=******
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
mysql QUIT

так вот, соединяется просто отлично с базой, но выдает
./sqlbash: line 5: check: command not found
./sqlbash: line 5: user: command not found
./sqlbash: line 5: check: command not found
почему же не sql свои команды смотрит?
как сделать так, чтобы он просматривал после соединения строку, начинающуюся с mysql> ..далее SELECT `ip`, `check` FROM `user` WHERE `check`=1;

просто этот запрос в самом sql отрабатывается на ура

А потому и пишет, что за один раз в sh выполняется только одна строка и нельзя делать какую-то последовательность комманд.

Тебе это надо всё скопом передавать. Потому, выглядеть это должно вот так:

Code: [Select]
#!/bin/sh

mysql -h localhost  -u root  -p db_test --password=****** -e '"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"'
символом ' можно переносить строки, есть ещё такие символы, т.е. можно написать тоже самое вот так и будет работать
Code: [Select]
mysql -h localhost  -u root  -p db_test --password=****** -e '
"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"
'

Offline lsk

  • Newbie
  • *
  • Posts: 26
  • Karma: +0/-0
Bash + SQL
« Reply #9 on: June 03, 2006, 14:30:00 »
НЕ РАБОТАЕТ
по прежнему говорит, что таких команд для BASHa не существует, это и понятно... и ругается опять на ковычки

SATAN, вот чего выдает на твою строчку:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the ma
nual that corresponds to your MySQL server version for the right syntax to use n
ear '"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"' at line 1
« Last Edit: June 03, 2006, 14:32:49 by lsk »

Offline Satan

  • Jr. Member
  • **
  • Posts: 74
  • Karma: +0/-0
  • qrcode
Bash + SQL
« Reply #10 on: June 03, 2006, 14:34:36 »
Quote from: lsk
НЕ РАБОТАЕТ
по прежнему говорит, что таких команд для BASHa не существует, это и понятно... и ругается опять на ковычки

SATAN, вот чего выдает на твою строчку:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the ma
nual that corresponds to your MySQL server version for the right syntax to use n
ear '"SELECT `ip`, `check` FROM `user` WHERE `check`=1;"' at line 1

mysql -h localhost  -u root  -p db_test --password=****** -e '
SELECT ip, check FROM user WHERE check=1
'
вот так напиши и не парься

Offline lsk

  • Newbie
  • *
  • Posts: 26
  • Karma: +0/-0
Bash + SQL
« Reply #11 on: June 03, 2006, 14:46:54 »
спасибо огромное работает.., но только если еще ковычки обратные поставить:
mysql -h localhost -u root -D inet_access --password=lauter -e '
SELECT `ip` FROM `user` WHERE `check`=1;
'
« Last Edit: June 03, 2006, 14:47:23 by lsk »

Offline Satan

  • Jr. Member
  • **
  • Posts: 74
  • Karma: +0/-0
  • qrcode
Bash + SQL
« Reply #12 on: June 03, 2006, 14:52:45 »
Quote from: lsk
спасибо огромное работает.., но только если еще ковычки обратные поставить:
mysql -h localhost -u root -D inet_access --password=lauter -e '
SELECT `ip` FROM `user` WHERE `check`=1;
'

вообще наличие кавычек ' ` или " зависит как-то напрямую от того в какой кодировке собрал mysql - я сам не знаю почему, но допустим конструкция с обратными кавычками у кого-то может не сработать, зато сработает вариант совсем без них

Offline Safir

  • Sr. Member
  • ****
  • Posts: 402
  • Karma: +0/-0
    • http://
Bash + SQL
« Reply #13 on: June 04, 2006, 10:28:36 »
Кстати, а правда, почему бы не написать скрипт на perl? Проще, надёжнее и быстрее работать будет. К тому же не будет проблем с обработкой результатов.

Offline demiurg

  • Hero Member
  • *****
  • Posts: 1014
  • Karma: +0/-0
    • http://larin.tomsk.ru
Bash + SQL
« Reply #14 on: June 04, 2006, 22:40:22 »
Quote from: Safir
Кстати, а правда, почему бы не написать скрипт на perl? Проще, надёжнее и быстрее работать будет. К тому же не будет проблем с обработкой результатов.
Видимо потому, что автор вопроса даже не удосужился хоть раз почитать руководство по bash, да он даже советов не слушает.
Code: [Select]
mysql -h localhost  -u root  -D db_test --password=****** -e 'SELECT `ip`, `check` FROM `user` WHERE `check`=1;' Прекрасно работает.
На крайний случай экранирование спец символов тоже никто не отменял
Code: [Select]
RESULT=`mysql -h localhost  -u root  -D db_test --password=****** -e 'SELECT \`ip\`, \`check\` FROM \`user\` WHERE \`check\`=1;'`
echo $RESULT;