2016-07-14 107 views
1

我想在一个事务中执行多个复杂语句,最后使用select语句进行进一步处理。如何使用apsw创建多个复杂的sqlite事务?

这样做一旦正常工作,但只要我再次执行相同的语句,它会导致下面的错误。

测试代码:

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()”,它的工作原理。在我的具体情况中,我希望得到一个结果,所以我编辑了代码来反映这一点。

+0

的可能的复制[蟒蛇sqlite的“BEGIN TRANSACTION”和“提交”命令(http://stackoverflow.com/questions/26770719/python-sqlite-begin-transaction-and-commit-commands) – AndrewK

回答

0

SQLite即时计算结果。当您拨打fetchone()时,执行只会根据需要运行,以返回一行。

为确保执行所有语句,请调用fetchall()或迭代结果,即使您知道只有一个语句。

最好不要将尽可能多的语句压缩到单个SQL字符串中。

+0

谢谢你有用的答案,我想我将不得不使用'fetchall()',因为我需要将所有语句压缩到一个事务中以确保正确的状态。 –

+0

您不需要为单个事务使用单个“执行”。 –