从游标创建临时表

1 投票
4 回答
5094 浏览
提问于 2025-04-16 00:07

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

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

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

这段内容来自于 这里

所以你也许可以做一些类似的事情。也许可以把游标的结果整体发送过去,像这样:

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

其实,Postgres数据库是一个一个地读取记录,而你通过fetchmany这个调用一次性获取1000条记录并把它们加载到内存中。我不太明白你期待的效果是怎样的。

如果想要更高效的做法,可以把所有的插入操作放在一个统一的开始和结束之间,这样就变成一个事务了。

你为什么要使用游标,而不是直接通过row_number()在临时表中添加一列来开始,这样可以确保数据是有序的呢?

0

我最后是这样做的:

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

而不是进行1000次单独的插入。虽然我还是不知道有没有更好的方法,但这个方法已经足够好用了。

撰写回答