Shell 长时间访问sqlite的最佳方式

Shell 长时间访问sqlite的最佳方式,shell,sqlite,Shell,Sqlite,好的,我有一个shell脚本,它使用sqlite数据库来存储数据。然而,它是一个长时间运行的脚本,随着时间的推移会运行很多小查询 目前,我正在为每个查询调用sqlite3“my.db”“SELECT*FROM foo”或类似的名称,但是我并不认为这是非常有效的,因为sqlite每次都必须重新打开数据库,除非它偷偷地将它们打开一段时间 然而,这也意味着如果我需要进行任何设置,比如指定超时选项,那么每次调用sqlite3时我都需要这样做 我想知道的是,是否有其他方法可以构建我的脚本,例如在交互模式下

好的,我有一个shell脚本,它使用sqlite数据库来存储数据。然而,它是一个长时间运行的脚本,随着时间的推移会运行很多小查询

目前,我正在为每个查询调用sqlite3“my.db”“SELECT*FROM foo”或类似的名称,但是我并不认为这是非常有效的,因为sqlite每次都必须重新打开数据库,除非它偷偷地将它们打开一段时间

然而,这也意味着如果我需要进行任何设置,比如指定超时选项,那么每次调用sqlite3时我都需要这样做

我想知道的是,是否有其他方法可以构建我的脚本,例如在交互模式下在后台打开sqlite3进程,并以某种方式向其提供查询和获取响应。有没有一个好的、健壮的方法来做到这一点

我已经尝试过这些方法,但我并不总是知道一个查询将返回多少个结果(如果有的话),因此我最终不得不执行类似于SELECT COUNT*FROM foo的查询,其中bar=1;选择*FROM foo,其中bar=1,这样我总是返回至少一行预期的结果数,但如果我以某种方式获得的结果比预期的多,这是不好的,因为当我运行下一个查询时,它们仍将等待

以下是我尝试过的内容的简写形式请原谅任何拼写错误,我一定会做一些:

#!/bin/sh
mkfifo '/tmp/db_in'
mkfifo '/tmp/db_out'

# Create the sqlite process in the background (assume database setup already)
sqlite3 'my.db' </tmp/db_in >/tmp/db_out &

# Set connection parameters
echo '.timeout 1000' >/tmp/db_in

# Perform a query with count in first result
echo 'SELECT COUNT(*) FROM foo WHERE bar=1;SELECT * FROM bar WHERE bar=1;' >/tmp/db_in
read results </tmp/db_out
while [ $results -gt 0 ]; do
    IFS='|'; read key value </tmp/db_out
    echo "$key=$value"

    results=$(($results - 1))
done
这是正确的做法,还是有更好的方法?我还没有想到一种方法让sqlite在每个查询的输出末尾返回一些东西,我认为这是一种更好的方法。我知道echo选项可以用于在查询输出之前回显查询,我至少可以使用它来确保我不会读取以前查询的任何剩余内容,但我确实希望能够更正确地处理任意长度的结果,而不需要先进行计数,因为这可能会失去同步

唯一的另一种选择似乎是将结果转储到一个文件中,但由于我可能要处理大量的查询,我真的不想这样做;至少有了先进先出技术,一切都还在记忆中

[编辑]
我刚刚注意到,在中写入db_之后,我使用closesqlite3尝试了上面的一些shell,在这种情况下,我认为fifo可能需要绑定到一个文件描述符以保持其打开。我现在不打算将其添加到示例中,因为这会使其更加复杂,但是如果解决方案使用了文件描述符,那么可能应该添加它以确保完整性。

在shell脚本中这样做有什么原因吗?您是否考虑过使用不同的脚本语言(如Python),而不需要经历SQLite shell过程?我可以,但如果不需要的话,我真的不想安装额外的脚本语言;我将使用它的所有机器都有一个shell,尽管有一些兼容性问题,sqlite3已经存在,所以如果可以的话,我想用shell脚本解决它;我肯定有办法。@Haravik:我很感激,但是任何有SQLite3的系统都可能至少有Python2.5,不是吗?早在2006年,Python在2.5版本就开始提供SQLite API;我需要它是兼容的,但我不能安装任何不是绝对必要的。问题是我与许多NAS设备合作,它们的标准化……根本不存在。直到我开始做这项工作,我才意识到Linux发行版有多不符合标准,有些甚至不支持所有POSIX标准特性,但有相当新的内核版本。通常我喜欢挑战,其他时候…你明白了=