有没有人知道如何从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,)
答案 0 :(得分:20)
resultproxy.rowcount最终是DBAPI属性cursor.rowcount的代理。大多数DBAPI不通过此属性为SELECT查询提供“行数”;其主要目的是提供UPDATE或DELETE语句匹配的行数。实际上,关系数据库不知道特定语句将返回多少行,直到找到所有这些行为止;许多DBAPI实现将在数据库找到它们时开始返回行,而不进行缓冲,因此在这些情况下甚至没有这样的计数。
要获取SELECT查询将返回的行数,您需要预先执行SELECT COUNT(*),或者需要将所有行提取到数组中并对数组执行len()。 / p>
ResultProxy.rowcount的注释进一步讨论了这个问题(http://docs.sqlalchemy.org/en/latest/core/connections.html?highlight=rowcount#sqlalchemy.engine.ResultProxy.rowcount):
关于ResultProxy.rowcount的注释:
此属性返回匹配的行数,但不一定与实际修改的行数相同 - 例如,如果SET,UPDATE语句可能在给定行上没有净更改给定的值与行中的值相同 已经。这样的行将匹配但不会被修改。在后端 这两种样式的功能,如MySQL,rowcount配置 默认情况下,在所有情况下都会返回匹配计数。
ResultProxy.rowcount仅 与UPDATE或DELETE语句一起使用。与Python DBAPI所说的相反,它确实如此 不返回SELECT结果中可用的行数 语句为DBAPI在行时不支持此功能 无缓冲。
所有方言都可能无法完全实现ResultProxy.rowcount。特别是,大多数DBAPI不支持聚合行数结果 来自executemany电话。 ResultProxy.supports_sane_rowcount()和ResultProxy.supports_sane_multi_rowcount()方法将从 如果已知每种用法都得到支持,则为方言。
- 使用RETURNING的语句可能无法返回正确的行数。
答案 1 :(得分:2)
你可以用这个:
rowcount = len(results._saved_cursor._result.rows)
然后你的代码将是
print '%s rows returned by query...\n' % rowcount
print results.keys()
仅测试了“查找”查询
它对我有用。