1

在使用 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

4 回答 4

1

好吧,Postgres 正在逐条读取游标记录,而您只需通过 fetchmany 调用获得 1000 个并将它们加载到内存中。我不确定您如何真正期望您要求的工作。

一个性能更好的版本将确保所有这些 INSERTS 都包装在一个 BEGIN 和 END 中,以便它的一个事务。

游标是否有原因,而不是仅通过 row_number() 将列添加到临时表中以开始 - 以便对其进行排序?

于 2010-06-18T00:18:57.077 回答
0

我没有使用过 PostgreSQL,但我知道要插入存储过程的结果,你会这样做:

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

取自这里

所以你能不能做类似的事情。也许将光标结果作为一个整体发送给它,例如:

CREATE TEMP TABLE foobar (id INTEGER)
INSERT INTO foobar 'rows'
于 2010-06-17T22:10:02.930 回答
0

我最终这样做了:

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

而不是 1000 个单独的插入。仍然不知道更好的方法,但这足够好。

于 2010-08-11T16:37:32.377 回答
0

你可以试试

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

请参阅快速执行助手文档以获取完整的 dets

于 2018-05-17T04:14:07.017 回答