2016-07-14 67 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

您不需要爲單個事務使用單個「執行」。 –