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

1

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

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

Теги:
cursor
sqlobject

4 ответа

0
Лучший ответ

Я закончил это:

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

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

1

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

Более эффективная версия этого будет обеспечивать, чтобы все эти INSERTS были завернуты в один BEGIN и END, чтобы одна транзакция.

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

0

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

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

см. Быстрые помощники выполнения docs для полных dets

0

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню