我不太确定在哪里问,我希望它就在这里。
我搜索的是在数据库繁忙时重试 SQLite 查询的最简单解决方案。我在服务器上使用 quassel 作为我的 IRC 客户端,我想将旧日志移动到单独的数据库以保持它使用的小型数据库。我为此编写的脚本是:
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;
我使用 sqlite3 quassel-storage.sqlite < movelog.sql 运行它
问题是,由于 quassel 在执行时正在运行,有时会BEGIN IMMEDIATE;
因为数据库被锁定而失败。
有人可以建议我一种简单的方法来更改该设置,以便每隔几秒钟重试一次查询,直到它起作用?我读到 python SQLite 包装器有内置的吗?有没有一种特殊的方法我必须激活它,更重要的是,我可以使用 python 附加第二个数据库吗?有一个超时参数,sqlite3.connect
但我不太确定它是如何工作的。Python 是否会锁定整个数据库以便在每次连接时进行写入?
我绝不会执着于使用 Python。我更喜欢的解决方案是 sqlite3 在发生此错误时返回 0,然后将其包装在 shell 中的循环中,但这似乎不起作用。