создать временную таблицу из курсора - PullRequest
1 голос
/ 18 июня 2010

Есть ли способ в PostgreSQL, доступ к которому осуществляется из Python с использованием SQLObject, создать временную таблицу из результатов курсора?

Ранее у меня был запрос, и я создал временную таблицу непосредственно из запроса.Тогда у меня было много других запросов, взаимодействующих с этой временной таблицей.

Теперь у меня гораздо больше данных, поэтому я хочу обрабатывать только 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)

или есть лучший способ?Это кажется ужасно неэффективным.

Ответы [ 4 ]

1 голос
/ 18 июня 2010

Ну, Postgres читает запись курсора за записью, и вы просто получаете 1000 из них с вызовом fetchmany и загружаете их в память. Я не уверен, как вы действительно ожидаете, что вы просите работать.

Более эффективная версия, которая гарантирует, что все эти ВСТАВКИ будут заключены в один BEGIN и END, так что это будет одна транзакция.

Есть ли причина для курсора в отличие от простого добавления столбца с помощью row_number () во временную таблицу, с которой нужно начинать - так, чтобы она упорядочилась?

0 голосов
/ 17 мая 2018

Вы можете попробовать

from psycopg2.extras import execute_values
execute_values(cursor, "INSERT INTO temp (id) VALUES %s", hids)

см. Помощники по быстрому исполнению Документы для полных документов

0 голосов
/ 11 августа 2010

В итоге я сделал это:

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

вместо 1000 отдельных вставок.Все еще не знаю лучшего способа, но это работает достаточно хорошо.

0 голосов
/ 18 июня 2010

Я не использовал PostgreSQL, но я знаю, что для вставки результатов хранимой процедуры вы должны сделать:

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

Взято из здесь .

Так что вы могли бы сделать что-то подобное.Может быть, отправить его курсором в целом, так что-то вроде:

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