从游标创建临时表

时间:2010-06-17 21:58:59

标签: python sql postgresql cursor sqlobject

有没有办法,在使用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)

还是有更好的方法?这看起来非常低效。

4 个答案:

答案 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文档以获取完整的设置