2016-07-24 90 views
1

我試圖執行3個不同的postgresql查詢與不同的表。每個查詢需要2秒鐘執行。我想知道是否可以同時運行所有3個查詢,這樣我可以節省4秒。我嘗試使用pyscopg2的異步功能,但它只返回上次查詢的結果。任何人都可以指出我做錯了什麼?如何使用pyscopg2的異步功能?

import select 
import psycopg2 
import psycopg2.extensions 

def wait(conn): 
    while 1: 
     state = conn.poll() 
     if state == psycopg2.extensions.POLL_OK: 
      break 
     elif state == psycopg2.extensions.POLL_WRITE: 
      select.select([], [conn.fileno()], []) 
     elif state == psycopg2.extensions.POLL_READ: 
      select.select([conn.fileno()], [], []) 
     else: 
      raise psycopg2.OperationalError("poll() returned %s" % state) 


aconn = psycopg2.connect(
    dbname=pg_name, 
    user=pg_username, 
    host=pg_host, 
    password=pg_password, 
    async=1) 

wait(aconn) 
acurs = aconn.cursor() 

acurs.execute(
       "SELECT 1;" 
       "SELECT ST_Length(ST_GeomFromText" 
       "('LINESTRING(743238 2967416,743238 2967450)',4326));" 
       "SELECT 3;" 
      ) 
wait(acurs.connection) 
result = acurs.fetchall() 
print result 

僅打印: 「結果」:[[3]]

回答

0

每Psycopg Introduction

[Psycopg]是libpq的包裝,官方PostgreSQL客戶端庫。

然後,望着libpqdocumentationPQexec()(用於SQL查詢發送到PostgreSQL數據庫的功能),我們可以看到下面的註釋(重點煤礦):在發送

多個查詢單個PQexec調用在單個事務中處理,除非在查詢字符串中包含明確的BEGIN/COMMIT命令以將其分成多個事務。 但請注意,返回的PGresult結構僅描述了從字符串執行的最後一個命令的結果。

所以,不幸的是,你想要做什麼,根本就不是由psycopg2libpq支持。 (這並不是說PostgreSQL的其他客戶端界面不支持它,但是這不在此範圍內)。

所以要回答你的問題,你在做什麼錯在執行多個SQL查詢在一個​​調用中,並試圖檢索所有之後的結果,而實際上這是不可能的。您需要明確執行每個查詢並分別檢索結果,或者嘗試查找支持一次返回多個結果集的PostgreSQL的另一個API。


Python數據庫API 2.0規範允許可選nextset()方法,通過該移動cursor從執行的查詢返回的下一個結果集庫來實現,但這種方法不psycopg2實現(原因很明顯),如果你試圖調用它,實際上會引發一個NotSupportedError異常(請參閱文檔)。