2017-01-26 103 views
1

我在Python中執行了幾次循環中的自寫函數postgresql。我正在使用psycopg2框架來執行此操作。 功能我竟結構如下寫道:函數執行後刪除臨時表

CREATE OR REPLACE FUNCTION my_func() 
RETURNS void AS 
$$ 
BEGIN 
    -- create a temporary table that should be deleted after 
    -- the functions finishes 
    -- normally a CREATE TABLE ... would be here 
    CREATE TEMPORARY TABLE temp_t 
     (
      seq integer, 
      ... 
     ) ON COMMIT DROP; 

    -- now the insert  
    INSERT INTO temp_t 
     SELECT 
     ... 

END 
$$ 
LANGUAGE 'plpgsql'; 

那基本上蟒蛇部分

import time 
import psycopg2 
conn = psycopg2.connect(host="localhost", user="user", password="...", dbname="some_db") 
cur = conn.cursor() 
for i in range(1, 11): 
    print i 
    print time.clock() 
    cur.callproc("my_func") 
    print time.clock() 
cur.close() 
conn.close() 

我得到的錯誤,當我運行python腳本是:

---> relation "temp_t" already exists 

基本上我想要測量執行該函數需要多長時間。這樣做,循環將運行幾次。將SELECT的結果存儲在一個臨時表中應該取代通常會創建輸出表的CREATE TABLE ...部分 爲什麼在我執行Python的功能後,該功能不起作用postgres

回答

1

臨時表在會話結束時被刪除。由於你的會話沒有以函數調用結束,所以第二個函數調用將嘗試再次創建表。你需要改變你的存儲功能,並檢查臨時表是否已經存在,如果沒有,就創建它。 This後可以幫助你這樣做。

1

另一個骯髒的問題是在每次函數調用之後連接和解除連接。

import time 
import psycopg2 
for i in range(1, 11): 
    conn = psycopg2.connect(host="localhost", user="user", password="...", dbname="some_db") 
    cur = conn.cursor() 
    print i 
    print time.clock() 
    cur.callproc("my_func") 
    print time.clock() 
    cur.close() 
    conn.close() 

不好,但有訣竅。

3

循環中的所有函數調用都在單個事務中執行,因此每次都不會刪除臨時表。設置autocommit應該改變此行爲:

... 
conn = psycopg2.connect(host="localhost", user="user", password="...", dbname="some_db") 
conn.autocommit = True 
cur = conn.cursor() 
for i in range(1, 11): 
    ...