2011-12-27 8 views
5

Как написать сценарий оболочки, который отображает результаты SQLite? Я написал сценарий, который добавляет запись в базу данных SQLite. Теперь я хочу отобразить результаты после добавления этой записи. Вот мой сценарий:Shell scripting 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, но не так хорош в сценариях оболочки. Я также ищу хорошие учебники, объясняющие такие проблемы.

+1

Поскольку вы «не так велики в сценариях оболочки», вы, вероятно, не должны использовать сценарии оболочки для решения этой проблемы. Используйте любую систему кодирования (C++, TCL, python, ...), в которой вы больше всего разбираетесь. Почти все, что вы, возможно, захотите использовать, имеет доступный интерфейс для API sqlite. – ravenspoint

+0

@ravenspoint: На самом деле, я управляю своими финансами с помощью SQL, а скрипты оболочки используются для быстрого добавления файлов и чтения сумм, запустив их из запуска сценария (Quicksilver). – CodeBreaker

+0

Поскольку вы говорите: «Я совершенно новый для SQL», я бы рекомендовал не использовать SQL для управления вашими финансами! – ravenspoint

ответ

9

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

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-выражения в формате sql, как большие, так и большие. Для вещей, которые будут происходить регулярно, и они варьируются от больших таблиц, если у вас есть разрешения в нашей системе, вы можете захотеть, чтобы ваш DML был хранимой процедурой и вызвал это.

Надеюсь, это поможет.

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

+0

Спасибо. Логика совершенна, но я не могу вставить ее в таблицу (первый оператор SQL). Проблема связана с скобками/кавычками. Другие заявления работают правильно. BTW, Rs.52 вещи не в моем вопросе. У меня есть расширение для браузера, которое конвертирует доллары в рупии, поэтому Rs.52 .. фактически являются знаками доллара, то есть аргументами: доллар1, доллар2, доллар3. Так или иначе, он показывает мне знаки доллара и другие. Rs.52 – CodeBreaker

+0

Вы можете сделать одиночную кавычку первого EOS, например: 'sqlite3 dbName.dba << 'EOS'' Это [предотвращает расширение переменных оболочки] (http://mywiki.wooledge.org/HereDocument) в heredoc. – Wildcard

3

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

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

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

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

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