Shell 脚本 SQLite

问题描述 投票:0回答:2

如何编写显示 SQLite 结果的 shell 脚本?我编写了一个向 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 很陌生,对 shell 脚本编写不太擅长。我也在寻找解释此类问题的优秀教程。

sqlite shell
2个回答
15
投票

解决此问题的一种常见方法是使用称为此处文档的 shell 功能,请尝试以下操作:

 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 存储到存储过程并调用它。

我希望这有帮助。

(如果这不起作用,请编辑您的帖子以表明您正在使用的 shell、操作系统/Linux 版本以及您收到的错误消息的最小版本)。

编辑:请注意,OP 的引用 (

'\'''$1''\''
) 可能仍然合适,具体取决于 shell 嵌套的级别。


8
投票

如果您需要将 sqlite SELECT 结果分配给 shell 变量,您可以这样做。

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

$r
将是你的变量。

也可以获取单行。您可以做一些工作将其拆分为数组,可能使用 IFS

另外请记住在每个 shell 脚本之上使用

#!/bin/bash
约定。它将解决许多不需要的问题。有时,旧的
#!/bin/sh
惯例会带来麻烦。 :).

© www.soinside.com 2019 - 2024. All rights reserved.