Есть ли способ, в 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)
или есть лучший способ? Это кажется ужасно неэффективным.
Я закончил это:
sql.execute(connection, """
INSERT INTO blah VALUES %s;""" % (
", ".join("(%d)" % hid for hid in hids)))
вместо 1000 отдельных вставок. Все еще не знаю лучшего способа, но это работает достаточно хорошо.
Well Postgres читает запись курсора по записи, и вы просто получаете 1000 из них с приемом fetchmany и загружаете их в память. Я не уверен, как вы действительно ожидаете, что вы просите работать.
Более эффективная версия этого будет обеспечивать, чтобы все эти INSERTS были завернуты в один BEGIN и END, чтобы одна транзакция.
Есть ли причина для курсора, а не просто добавить столбец через row_number() во временную таблицу, чтобы начать с - так, чтобы его упорядоченный?
Вы можете попробовать
from psycopg2.extras import execute_values
execute_values(cursor, "INSERT INTO temp (id) VALUES %s", hids)
см. Быстрые помощники выполнения docs для полных dets
Я не использовал PostgreSQL, но я знаю, что для вставки результатов хранимой процедуры вы бы сделали:
INSERT INTO #SHIPINFO
exec TESTDTA.S59RSH05 @SCBILLTO, @INID, @ADRSTYPE
Взято из здесь.
Так вы могли бы сделать что-то подобное. Возможно, отправьте ему результаты курсора в целом, чтобы что-то вроде:
CREATE TEMP TABLE foobar (id INTEGER)
INSERT INTO foobar 'rows'