Sqlite

如何從命令行在 sqlite3 中指定超時?

  • April 23, 2019

我有幾個基本腳本,在填充我的 sqlite3 數據庫時會彈出一些資訊,但大約有一半的時間命令會立即失敗:

$ sqlite3 outgoing.db "select * from edges where worker is not null;"
Error: database is locked
$ sqlite3 outgoing.db "select * from edges where worker is not null;"
Error: database is locked
$ sqlite3 outgoing.db "select * from edges where worker is not null;"
1014->9000|1014|9000||-1.0|2
1014->9001|1014|9001||-1.0|2
...

如果我添加.timeout 1;到命令的開頭,我只會得到一個語法錯誤;如何.通過命令行以非互動方式傳遞 sqlite 特殊參數?

您可以使用初始化文件來執行此操作。

init.sql(請注意,超時值以毫秒為單位 - 1 相當短):

.timeout 1000

在提示下:

$ sqlite3 -init init.sql outgoing.db "select * from edges where worker is not null;"
Loading resources from init.sql
# 1 second pause
Error: database is locked

使用一些 shell(至少在 Linux 上,不是很便攜),如果這是一個問題,您可以避免需要一個帶有程序替換的正確文件:

$ sqlite3 -init <(echo .timeout 1000) your.db "your sql;"

.output如果將輸出重定向到文件或管道,或者如果您在 init 文件中指定了文件,則不會列印額外的輸出行(“從…載入資源”) 。

引用自:https://dba.stackexchange.com/questions/47919