2010-06-17 88 views
0

在使用SQLObject從Python進行訪問的PostgreSQL中,有什麼方法可以根據遊標的結果創建一個臨時表?從光標創建臨時表

以前,我有一個查詢,我直接從查詢創建臨時表。然後我有許多其他查詢與臨時表進行交互。

現在我有更多的數據,所以我想一次只處理1000行。但是,我不能從遊標執行CREATE TEMP TABLE ... AS ...,而不是我所能看到的。是唯一做這樣的事情:

rows = cur.fetchmany(1000); 
cur2 = conn.cursor() 
cur2.execute("""CREATE TEMP TABLE foobar (id INTEGER)""") 
for row in rows: 
    cur2.execute("""INSERT INTO foobar (%d)""" % row) 

或者有沒有更好的方法?這似乎非常低效。

回答

0

我最後做這樣的:

 sql.execute(connection, """ 
INSERT INTO blah VALUES %s;""" % (
    ", ".join("(%d)" % hid for hid in hids))) 

不是1000獨立插入。仍然不知道更好的方式,但這種方式運作得很好。

0

我沒有使用PostgreSQL的,但我知道,插入一個存儲過程,你會做的結果:

INSERT INTO #SHIPINFO 
exec TESTDTA.S59RSH05 @SCBILLTO, @INID, @ADRSTYPE 

here服用。

所以你可能會做類似的事情。也許把它光標結果作爲一個整體所以像:

CREATE TEMP TABLE foobar (id INTEGER) 
INSERT INTO foobar 'rows' 
1

好Postgres的在讀通過記錄光標記錄和你剛開始那些支持fetchmany電話1000,並將其加載到內存中。我不確定你如何真正期待你要求的工作。

一個更好的執行版本將確保所有那些INSERTS被包裝在一個單獨的BEGIN和END中,以便它的一個事務。

是否有一個光標的原因,而不是僅僅通過row_number()將列添加到臨時表中,以便使用它的有序?