【问题标题】:Psycopg2 rowcount for server side cursor服务器端游标的 Psycopg2 行数
【发布时间】:2018-01-05 10:02:14
【问题描述】:

我正在查询 Postgres 数据库以获取大量结果,并希望使用服务器端游标将结果流式传输到我的客户端。看起来当我这样做时,光标的rowcount 属性现在在我执行查询后设置为-1。我正在像这样创建光标:

with db.cursor('cursor_name') as cursor:

在从数据库流式传输结果时,有没有办法找到我的查询结果的数量? (我可以使用SELECT COUNT(*),但我想避免这种情况,因为我试图抽象出围绕查询的代码,这会使 API 复杂化)。

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

    在服务器端游标的情况下,虽然cursor.execute() 返回,但查询不一定在该点被服务器执行,因此行数对psycopg2 不可用。这与DBAPI 2.0 spec 一致,后者指出如果最后一个操作的行数不确定,rowcount 应该为 -1。

    尝试使用cursor.fetchone() 强制它,例如,更新cursor.rowcount,但仅通过检索到的项目数,所以这没有用。 cursor.fetchall() 将导致 rowcount 被正确设置,但是,这会执行您想要避免的完整查询和数据传输。

    避免完全单独的查询来获取计数并且应该给出准确结果的可能解决方法是:

    select *, (select count(*) from test) from test;
    

    这将导致每一行都将表格行数作为最后一列附加。然后您可以使用cursor.fetchone() 获取表格行数,然后获取最后一列:

    with db.cursor('cursor_name') as cursor:
        cursor.execute('select *, (select count(*) from test) from test')
        row = cursor.fetchone()
        data, count = row[:-1], row[-1]
    

    现在count 将包含表中的行数。您可以使用row[:-1] 来引用行数据。

    这可能会减慢查询速度,因为可能会执行昂贵的SELECT COUNT(*),但一旦完成检索数据应该会很快。

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 2015-08-06
      • 2020-12-16
      • 2018-04-29
      相关资源
      最近更新 更多