![](/img/trans.png)
[英](python-)sqlite3: prevent COMMIT from resetting read cursor on unrelated temporary table
[英]create temporary table from cursor
在使用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)
或者,还有更好的方法? 这似乎效率很低。
好了,Postgres正在逐条记录地读取游标记录,而通过fetchmany调用就可以获取其中的1000条记录并将其加载到内存中。 我不确定您会如何期望自己的工作。
更好地执行该操作的版本将确保将所有这些INSERTS包裹在单个BEGIN和END中,以便进行一次事务处理。
游标有什么理由,而不是仅仅通过row_number()将一列添加到临时表中以开始-以便其有序?
我没有使用PostgreSQL,但是我知道要插入存储过程的结果,您可以这样做:
INSERT INTO #SHIPINFO
exec TESTDTA.S59RSH05 @SCBILLTO, @INID, @ADRSTYPE
取自这里 。
所以您也许可以做类似的事情。 也许将光标结果作为一个整体发送给它,例如:
CREATE TEMP TABLE foobar (id INTEGER)
INSERT INTO foobar 'rows'
我最终这样做:
sql.execute(connection, """
INSERT INTO blah VALUES %s;""" % (
", ".join("(%d)" % hid for hid in hids)))
而不是1000个单独的插件。 仍然不知道更好的方法,但是效果很好。
你可以试试
from psycopg2.extras import execute_values
execute_values(cursor, "INSERT INTO temp (id) VALUES %s", hids)
有关完整的说明,请参见快速执行帮助器文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.