2010-06-17 4 views
0

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

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

ответ

0

я в конечном итоге делает это:

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

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

0

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

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

Взятые из here.

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

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

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

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

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

Смежные вопросы