从游标创建临时表
有没有办法在使用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次单独的插入。虽然我还是不知道有没有更好的方法,但这个方法已经足够好用了。