2010-06-08 42 views
2

我想通過將它們放在BEGIN;END;之間來同時運行多個select查詢。我試過如下:SQL從BEGIN中獲取數據; ...;結束; block in python

cur = connection.cursor() 
cur.execute(""" 
BEGIN; 
SELECT ...; 
END;""") 
res = cur.fetchall() 

但是,我得到的錯誤:

psycopg2.ProgrammingError: no results to fetch 

我怎樣才能真正得到的數據這樣?

同樣,如果我連續有很多選擇,我只會從最新的一個獲取數據。有沒有辦法從所有這些數據中獲取數據?

回答

4

Postgresql實際上並不支持從單個命令返回多個結果集。如果你通過這個輸入的psql:

BEGIN; 
SELECT ...; 
END; 

它會分裂這件事客戶端和實際執行三個語句,只有第二的返回結果集。

「BEGIN」和「END」是開始/結束事務的SQL級命令。 (這樣做可能會有一個較低級的協議,但我不記得)。你可能不想直接發佈它們,而是讓你的驅動程序(psycopg2)來處理它。例如,在Perl的DBI中,我在連接時指定了AutoCommit => 0,並且在我的第一個命令之前隱式地發出了「BEGIN」;然後「END」(或「COMMIT」等),當我明確地調用$ dbh-> commit;我猜Python的DB-API的工作原理與此類似,因爲其他系統(如JDBC)也是如此......

+0

好的。我只是想加快速度,但由於它無論如何都要進行三次往返,所以沒關係 – Claudiu 2010-06-08 23:26:56

0

如果您只是選擇了一些東西,並且您沒有執行任何DML之類的功能,您不需要以我知道的任何理由進行明確的交易。