2017-01-26 4 views
1

Я выполняю самозаписываемую функцию postgresql в цикле в несколько раз от Python. Для этого я использую фреймворк 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'; 

Thats в основном питон часть

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 ..., которая обычно создавала бы таблицу вывода Почему не postgres отбросить функцию после выполнения функции от Python?

ответ

1

Временные таблицы отбрасываются при завершении сеанса. Поскольку ваш сеанс не заканчивается вызовом функции, второй вызов функции попытается снова создать таблицу. Вам нужно изменить функцию хранилища и проверить, существует ли временная таблица, и создать ее, если это не так. Сообщение This может помочь вам в этом.

1

Еще один быстрый n грязный - подключиться и отключиться после каждого вызова функции.

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): 
    ... 
Смежные вопросы