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 不应为零的主要内容,如果未能解决你的问题,请参考以下文章
sqlalchemy.exc.NoSuchModuleError:无法加载插件:sqlalchemy.dialects:postgres
SQLAlchemy 是不是从同一连接重置 SQLAlchemy 会话之间的数据库会话?
SQLAlchemy使用笔记--SQLAlchemy ORM