我有一个应用程序,我在任何地方都使用 sqlite3 的自动提交功能,这通常可以正常工作。该应用程序包括一个数据库方案更新程序。
基本上它只是每个版本升级的一组 SQL 命令,应该在单个事务中调用。我通过使用 .executemany() 调用实现了这一点,该调用一直有效。现在是第一次,我想使用这种方法更改表描述(我做了一个简短的示例,因为原始表相当大):
考虑到
-- the Table in the current Version:
table: foo (foo_id INTEGER PRIMARY KEY, quantity INTEGER,
single_price REAL, all_price REAL)
-- where I want to end:
table: foo (foo_id INTEGER PRIMARY KEY, quantity INTEGER,
single_price REAL, total_price REAL)
(so renaming the 4th column)
我不是在这里谈论索引,没有问题是一样的:)
我尝试在单个 executemany() 中运行的是:
ALTER TABLE foo RENAME TO foo_PREv2;
CREATE TABLE foo (foo_id INTEGER PRIMARY KEY, quantity INTEGER,
single_price REAL, total_price REAL);
INSERT INTO foo (foo_id, quantity,
single_price, total_price)
SELECT foo_id, quantity,
single_price, all_price
FROM foo_PREv2;
DROP TABLE foo_PREv2; -- <<<--- here it fails with a database locked error
即使我将 DROP 移动到第二个 executemany() 调用,它也不起作用。我必须重新启动我的应用程序才能 DROP。
据我了解, executemany() 为我处理 BEGIN TRANSACTION ... COMMIT 东西。我想念什么?
提前感谢,国王问候,弗洛里安。