有谁知道如何在不循环结果集的情况下从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,)

最佳答案

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):

关于python - SQL炼金术ResultProxy.rowcount不应为z,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13145068/

10-09 17:39