SQLAlchemy ResultProxy.rowcount 不应为零

Posted

技术标签:

【中文标题】SQLAlchemy ResultProxy.rowcount 不应为零【英文标题】:SQL Alchemy ResultProxy.rowcount should not be zero 【发布时间】:2012-10-30 18:05:30 【问题描述】:

有谁知道如何在不遍历结果集的情况下从 SQL Alchemy 查询 ResultProxy 对象中获取行数? ResultProxy.rowcount 属性显示 0,我希望它的值为 2。对于更新,它显示受影响的行数,这是我所期望的。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine(
    'oracle+cx_oracle://user:pass@host:port/database'
    )

session = sessionmaker(
    bind = engine
    , autocommit = False
    , autoflush = False
    )()

sql_text = u"""
    SELECT 1 AS Val FROM dual UNION ALL
    SELECT 2 AS Val FROM dual
    """

results = session.execute(sql_text)

print '%s rows returned by query...\n' % results.rowcount
print results.keys()

for i in results:
    print repr(i)

输出:

0 rows returned by query...

[u'val']
(1,)
(2,)

【问题讨论】:

【参考方案1】:

resultproxy.rowcount 最终是 DBAPI 属性 cursor.rowcount 的代理。大多数 DBAPI 不通过此属性为 SELECT 查询提供“行数”;其主要目的是提供与 UPDATE 或 DELETE 语句匹配的行数。实际上,关系数据库在完成对所有行的定位之前,并不知道特定语句将返回多少行。许多 DBAPI 实现将在数据库找到行时开始返回行,而不进行缓冲,因此在这些情况下甚至没有这样的计数。

要获取 SELECT 查询将返回的行数,您需要预先执行 SELECT COUNT(*),或者需要将所有行提取到数组中并在数组上执行 len()。

ResultProxy.rowcount 上的注释进一步讨论了这一点(http://docs.sqlalchemy.org/en/latest/core/connections.html?highlight=rowcount#sqlalchemy.engine.ResultProxy.rowcount):

关于 ResultProxy.rowcount 的说明:

此属性返回匹配的行数,不一定与实际修改的行数相同 - 例如,如果 SET给出的值与行中的值相同 已经。这样的行将被匹配但不会被修改。在后端 具有两种样式的功能,例如 mysql,行数由 默认返回所有情况下的匹配计数。

ResultProxy.rowcount 与 UPDATE 或 DELETE 语句结合使用。与 Python DBAPI 所说的相反,它确实 不返回 SELECT 结果中可用的行数 语句,因为 DBAPI 不能在行时支持此功能 无缓冲。

ResultProxy.rowcount 可能不会被所有方言完全实现。特别是,大多数 DBAPI 不支持聚合行计数结果 来自 executemany 调用。 ResultProxy.supports_sane_rowcount() 和 ResultProxy.supports_sane_multi_rowcount() 方法将从 方言(如果已知每种用法都受支持)。

使用 RETURNING 的语句可能无法返回正确的行数。

【讨论】:

【参考方案2】:

你可以用这个:

rowcount = len(results._saved_cursor._result.rows)

那么你的代码将是

print '%s rows returned by query...\n' % rowcount
print results.keys()

仅经过测试的“查找”查询

它对我有用。

【讨论】:

这也对我有用,希望我能早点找到它!谢谢!

以上是关于SQLAlchemy ResultProxy.rowcount 不应为零的主要内容,如果未能解决你的问题,请参考以下文章

flask-sqlalchemy

sqlalchemy.exc.NoSuchModuleError:无法加载插件:sqlalchemy.dialects:postgres

SQLAlchemy 是不是从同一连接重置 SQLAlchemy 会话之间的数据库会话?

SQLAlchemy使用笔记--SQLAlchemy ORM

SQLAlchemy -- Python的SQLAlchemy和ORM

SQLAlchemy(一):SQLAlchemy去连接数据库ORM介绍将ORM模型映射到数据库中