【问题标题】:create temporary table from cursor从游标创建临时表
【发布时间】:2010-06-17 21:58:58
【问题描述】:

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

或者有更好的方法吗?这似乎非常低效。

【问题讨论】:

    标签: python sql postgresql cursor sqlobject


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      取自here

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

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

      【讨论】:

        【解决方案3】:

        我最终这样做了:

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

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

        【讨论】:

          【解决方案4】:

          你可以试试

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

          请参阅Fast execution helpers 文档以获取完整信息

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-01
            • 1970-01-01
            • 2016-03-06
            • 2022-11-22
            • 2011-11-03
            • 1970-01-01
            相关资源
            最近更新 更多