如何使用apsw创建多个带有预期输出的复杂sqlite事务?

w3nuxt5m  于 2022-12-27  发布在  SQLite
关注(0)|答案(1)|浏览(161)

我想在一个事务中执行几个复杂的语句,并在末尾使用一个select语句进行进一步的处理。
这样做一次效果很好,但只要我再次执行同一语句,就会导致下面的错误。
试验代码:

import apsw
connection = apsw.Connection("temp.db")

cursor = connection.cursor()
cursor.execute("""
BEGIN TRANSACTION;
CREATE TABLE Foo(x);
COMMIT;
""")

cursor = connection.cursor()
print(cursor.execute("""
BEGIN TRANSACTION;
INSERT INTO Foo (x) VALUES (1);
INSERT INTO Foo (x) VALUES (2);
SELECT x FROM Foo LIMIT 1;
COMMIT;
""").fetchone())

cursor = connection.cursor()
print(cursor.execute("""
BEGIN TRANSACTION;
INSERT INTO Foo (x) VALUES (3);
INSERT INTO Foo (x) VALUES (4);
SELECT x FROM Foo LIMIT 1;
COMMIT;
""").fetchone())

输出:

$ python test.py 
(1,)
Traceback (most recent call last):
  File "test.py", line 28, in <module>
    """).fetchone())
  File "src/cursor.c", line 236, in resetcursor
apsw.SQLError: SQLError: cannot start a transaction within a transaction

编辑:它似乎与"fetchone()"方法有关,如果我使用"fetchall()",它就可以工作。在我的特定情况下,我确实希望得到一个结果,所以我编辑了代码以反映这一点。

nfzehxib

nfzehxib1#

SQLite动态地计算结果。当你调用fetchone()时,执行只运行到需要返回一行的程度。
要确保执行所有语句,请调用fetchall()或迭代结果,即使您知道只有一个结果。
最好不要将尽可能多的语句压缩到单个SQL字符串中。

相关问题