Сценарии оболочки SQLite - PullRequest
       2

Сценарии оболочки SQLite

6 голосов
/ 27 декабря 2011

Как мне написать скрипт оболочки, который отображает результаты SQLite? Я написал скрипт, который добавляет запись в базу данных SQLite. Теперь я хочу отобразить результаты после добавления этой записи. Вот мой сценарий:

echo 'insert into myTable (Date, Details, Category, Average) values (datetime('\''now'\'','\''localtime'\''), '\'''$1''\'', '\'''$2''\'', '$3');'|sqlite3 /Users/user/Documents/Test/dbName.db

После этого я хочу, чтобы скрипт повторил / выплюнул вывод операторов:

select sum(Average) from (select * from myTable where Category = 'category1');
select sum(Average) from (select * from myTable where Category = 'category2');

Формат должен быть таким:

Category1 total = <output of first statement>
Category2 total = <output of second statement>

Вот и все. Я довольно новичок в SQL и не так хорош в сценариях оболочки. Я также ищу хорошие учебники, объясняющие подобные проблемы.

Ответы [ 2 ]

10 голосов
/ 28 декабря 2011

Один из распространенных способов решения этой проблемы - использовать функцию оболочки, называемую здесь документом, попробуйте это:

 sqlite3 /Users/user/Documents/Test/dbName.dba <<EOS
     insert into myTable (Date, Details, Category, Average) 
               values(datetime('now','localtime'), '$1', '$2', '$3');

     select "Category1 total = " sum(Average) from (
          select * from myTable where Category = 'category1'
     );

     select "Category2 total = " sum(Average) from (
         select * from myTable where Category = 'category2'
     );

 EOS

Обратите внимание, что EOS может быть любой строкой, которая вам нравится (я думаю о EndOfScript), ноон должен быть один в последней строке текста без запаздывающих пробелов.

Поскольку я не использую sqlite3, вам может потребоваться некоторая статистика, чтобы закрыть пакет, о котором я не знаю.Кроме того, я не уверен, что вещи за $ 1 будут работать, если sqlite3 простителен, попробуйте вместо этого «$ 1» и т.д.Кроме того, вам может понадобиться запятая после строки "CategoryN total = ".

Обратите внимание, что это решение позволяет вам создавать свои SQL-операторы DML настолько большие / длинные, насколько вам нужно.Для вещей, которые будут происходить регулярно, и это касается больших таблиц, если у вас есть разрешения в нашей системе, вы можете захотеть, чтобы ваш DML использовал хранимую процедуру и вызывать ее.

Надеюсь, это поможет.* (Если это не работает, пожалуйста, отредактируйте свой пост, чтобы указать, какую оболочку вы используете, OS / Linux Ver и минимальную версию сообщений об ошибках, которые вы получаете).

5 голосов
/ 04 апреля 2017

Если вам нужно присвоить результат sqlite SELECT переменной оболочки, вы можете сделать это.

r=$(sqlite3 your_db_path.db "select something from some_table where condition")

$r будет вашей переменной.

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

Кроме того, не забывайте использовать соглашение #!/bin/bash поверх каждого сценария оболочки. Это решит многие нежелательные проблемы. Несколько раз #!/bin/sh конвенция доставляет неприятности. :.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...