Использование sqlite в bash -e

Искусство написания bash скриптов. Делимся своими наработками
Ответить
Аватара пользователя
ZEN
Администратор
Сообщения: 1349
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

Использование sqlite в bash -e

Сообщение ZEN » 12 июн 2015, 19:09

Далее скорее заметки и идеи для будущих наработок, чем статья. Будем через bash записывать/читать данные из sql-базы. Поехали!
  1. Первым делом создадим табличку test. Замечу, что файл test.sql отсутствует - он появится сразу, после создания таблицы.

    Код: Выделить всё

    $ echo "CREATE TABLE test(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, PASSWORD TEXT NOT NULL);" | sqlite3 test.sql && echo OK
    OK
    $ 
    А так же, с помощью && я вывожу текст OK, если ошибок нет. Здесь можно было просто использовать echo $? для проверки, что статус код равен нулю, но вариант с 'OK' нагляднее. На данном этапе мы получили пустую таблицу с полями ID, NAME, PASSWORD.
  2. Пробуем сохранить данные в таблице:

    Код: Выделить всё

    $ echo "INSERT INTO test (NAME, PASSWORD) VALUES ('User1', 'Password1');" | sqlite3 test.sql && echo OK
    OK
    $ echo "INSERT INTO test (NAME, PASSWORD) VALUES ('User2', 'Password2');" | sqlite3 test.sql && echo OK
    OK
    $
    
    В результате у нас будет таблица следующего содержания:

    Код: Выделить всё

    ┌───┬─────┬─────────┐
    │ ID│ NAME│ PASSWORD│
    ├───┼─────┼─────────┤
    │ 1 │User1│Password1│
    ├───┼─────┼─────────┤
    │ 2 │User2│Password2│
    └───┴─────┴─────────┘
  3. Теперь попробуем прочитать данные из таблицы. Сперва, вытащим имя пользователя с ID=1:

    Код: Выделить всё

    $ echo "SELECT NAME FROM test WHERE ID=1;" | sqlite3 test.sql && echo OK
    User1
    OK
    $
    
  4. Доработаем команду, что бы сохранять результат чтения из таблицы в переменную окружения NAME

    Код: Выделить всё

    $ NAME=$(echo "SELECT NAME FROM test WHERE ID=1;" | sqlite3 test.sql) && echo OK && echo $NAME
    OK
    User1
    $
    
  5. Повторим то же самое для поля PASSWORD:

    Код: Выделить всё

    $ PASSWORD=$(echo "SELECT PASSWORD FROM test WHERE ID=1;" | sqlite3 test.sql) && echo OK && echo $PASSWORD
    OK
    Password1
    $
  6. Еще один вариант - сохраняем NAME,PASSWORD в одну переменную и вытаскиваем из них данные

    Код: Выделить всё

    $ USER_CREDENTIALS=$(echo "SELECT NAME, PASSWORD FROM test WHERE ID=1;" | sqlite3 test.sql) && echo OK
    OK
    $ echo "NAME: ${USER_CREDENTIALS%%|*}"
    NAME: User1
    $ echo "PASSWORD: ${USER_CREDENTIALS#*|}"
    PASSWORD: Password1
    $
    Стоит учесть, что по-умолчанию в sqlite в качестве разделителя используется символ "|". Если этот сивол будет присутствовать в поле NAME, то код выше сработает не корректно. Как вариант, можно перед вставкой в таблицу средствами bash проверить, что NAME/PASSWORD не содержат символ "|".
  7. А теперь то же самое, что и в прошлом шагу, только в цикле while для всех строк таблицы test:

    Код: Выделить всё

    $ while read USER_CREDENTIALS; do echo "NAME: ${USER_CREDENTIALS%%|*}"; echo "PASSWORD: ${USER_CREDENTIALS#*|}"; echo; done < <(echo "SELECT NAME,PASSWORD FROM test;" | sqlite3 test.sql)
    NAME: User1
    PASSWORD: Password1
    
    NAME: User2
    PASSWORD: Password2
    
    $

На этом всё! Сложно представить, когда может потребоваться работа с БД через bash. Обычно для этого используются другие языки с готовыми модулями покрывающие > 90% возможных ошибок. Но тем не менее вам решать какой инструмент использовать ;)
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
lumberjack
Модератор
Сообщения: 1009
Зарегистрирован: 30 сен 2012, 04:04
Темы: 152
Откуда: Сургут
Статус: Не в сети

Re: Использование sqlite в bash -e

Сообщение lumberjack » 13 июн 2015, 01:54

хм... весьма интересно :)

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей