有没有办法,在使用SQLObject从Python访问的PostgreSQL中,从游标的结果创建一个临时表?
以前,我有一个查询,我直接从查询创建了临时表。然后,我有许多其他查询与临时表交互。
现在我有更多的数据,所以我想一次只处理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 :(得分:1)
Postgres正在按记录读取光标记录,你只需要获得1000个带有fetchmany调用并将它们加载到内存中的记录。我不确定你真的会期待你要求的工作。
性能更好的版本将确保所有这些INSERTS都包含在一个BEGIN和END中,以便它的一个事务。
光标是否有原因而不是仅仅通过row_number()将列添加到临时表中以开始 - 以便它有序?
答案 1 :(得分:0)
我没有使用PostgreSQL,但我知道要插入存储过程的结果,你会这样做:
INSERT INTO #SHIPINFO
exec TESTDTA.S59RSH05 @SCBILLTO, @INID, @ADRSTYPE
取自here。
你也许可以做类似的事情。也许将光标结果作为一个整体发送给它,如:
CREATE TEMP TABLE foobar (id INTEGER)
INSERT INTO foobar 'rows'
答案 2 :(得分:0)
我最终这样做了:
sql.execute(connection, """
INSERT INTO blah VALUES %s;""" % (
", ".join("(%d)" % hid for hid in hids)))
而不是1000个单独的插入。仍然不知道更好的方法,但这很好用。
答案 3 :(得分:0)
您可以尝试
from psycopg2.extras import execute_values
execute_values(cursor, "INSERT INTO temp (id) VALUES %s", hids)
请参阅Fast execution helpers文档以获取完整的设置