Создать временную таблицу из курсора
Есть ли способ, в 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)
см. документацию помощников по быстрому исполнению для получения полной информации