1

我有一个应用程序,我在任何地方都使用 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 东西。我想念什么?

提前感谢,国王问候,弗洛里安。

4

0 回答 0