在选择 while 循环时更新 sqlite 数据库

Use*_*ser 4 script bash sqlite bash-scripting

有一个 bash 脚本将对引用 sqlite 数据库的文件执行“一些魔法”\xe2\x84\xa2,并且在执行“一些魔法”\xe2\x84\xa2 后,应该更新数据库。这是简化的代码

\n\n
sqlite3 database.db "select NUMBER from table WHERE STATUS = \'N\'" | while read line; do\n    SELECTION=$(echo $line | awk -F\'|\' \'{ print $1 }\')\n    [some magic]\xe2\x84\xa2\n    sqlite3 database.db "update table SET STATUS=\'Y\' WHERE NUMBER=\'$SELECTION\'"\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

一切正常,sqlite 数据库将被逐行读取,我可以对引用的文件执行“一些魔法”\xe2\x84\xa2,但我可以\xc2\xb4t 更新数据库中的行 - I\xc2\xb4ve出现错误:

\n\n
\n

错误:数据库已锁定

\n
\n\n

有人知道我如何在读取数据库时更新数据库吗?或者还有其他解决方案可以让我做到这一点吗?

\n

Mat*_*lis 5

如果您不想移动到真正的 SQL 数据库,并且无法临时存储结果,则必须确保不在同一个表上运行并发 SELECT 和 UPDATE。

\n\n

请参阅SELECT 的LIMIT指令。

\n\n

所以你会做类似的事情:

\n\n
line=x\nwhile [ -n "$line" ]\ndo\n    line=$(sqlite3 database.db "select NUMBER from table WHERE STATUS = \'N\'" LIMIT 1)\n    SELECTION=$(echo $line | awk -F\'|\' \'{ print $1 }\')\n    [some magic]\xe2\x84\xa2\n    sqlite3 database.db "update table SET STATUS=\'Y\' WHERE NUMBER=\'$SELECTION\'"\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将使 SELECT 始终只返回一个结果并完成,然后您将对其进行处理和更新,然后重新运行 SELECT 以获取下一个结果(当状态更改时,SELECT 将获取下一个值,而不是旧值,因为它不再匹配“N” )

\n\n

或者也许你可以通过 SQL 而不是 shell 做“一些魔法(tm)”,这样你就可以将所有工作卸载到 SQL 引擎......

\n