Создать временную таблицу из курсора

Есть ли способ, в 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 ответа

Решение

Я закончил тем, что сделал это:

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

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

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

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

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

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

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

Взято отсюда.

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

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

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

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

см. документацию помощников по быстрому исполнению для получения полной информации

Другие вопросы по тегам