どこに聞いたらいいのかよくわかりませんが、ここにあるといいのですが。
私が探しているのは、DBがビジーの場合にSQLiteクエリを再試行する最も簡単なソリューションです。サーバー上のIRCクライアントとしてquasselを使用していますが、古いログを別のDBに移動して、使用するログを小さくしたいと考えています。それを行うために私が書いたスクリプトは次のとおりです。
CREATE TEMP TABLE delfrom (id integer,val integer);
ATTACH '/home/irc/oldlog.db' as log;
BEGIN IMMEDIATE;
REPLACE INTO delfrom (id,val) select 1337,messageid from backlog where time < strftime('%s', 'now','-14 days') ORDER BY messageid DESC LIMIT 1;
INSERT INTO log.log (messageid,time,bufferid,type,flags,senderid,message) SELECT messageid,time,bufferid,type,flags,senderid,message FROM backlog WHERE messageid < (SELECT val FROM delfrom where id=1337);
DELETE FROM backlog WHERE messageid < (SELECT val FROM delfrom where id=1337);
PRAGMA incremental_vacuum;
COMMIT;
そして、sqlite3quassel-storage.sqlite<movelog.sqlを使用して実行します
問題は、これが実行されている間、quasselが実行BEGIN IMMEDIATE;
されているため、DBがロックされているために失敗することがあるということです。
誰かが私にその設定を変更する簡単な方法を提案して、クエリが機能するまで数秒ごとに再試行されるようにすることはできますか?Python SQLiteラッパーにそれが組み込まれていることを読みましたか?これをアクティブにする特別な方法はありますか?さらに重要なのは、Pythonを使用して2番目のDBをアタッチできますか?にタイムアウトパラメータがありますが、sqlite3.connect
それがどのように機能するかはよくわかりません。Pythonは、接続ごとに書き込むためにDB全体をロックしますか?
私はPythonの使用に固執しているわけではありません。私が好む解決策は、このエラーが発生したときにsqlite3が0を返し、それをシェルのループにラップすることですが、それは機能しないようです。