Python SQL Alchemy ResultProxy.rowcount不应为零

Python SQL Alchemy ResultProxy.rowcount不应为零,python,sqlalchemy,rowcount,Python,Sqlalchemy,Rowcount,有人知道如何从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

有人知道如何从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=rowcountsqlalchemy.engine.ResultProxy.rowcount:

有关ResultProxy.rowcount的说明:

此属性返回匹配的行数,这不一定与实际修改的行数相同-例如,如果给定的集合值与行中的集合值相同,则UPDATE语句在给定行上可能没有净更改 已经这样的行将被匹配,但不会被修改。在后端 这两种样式都具有,例如MySQL,rowcount由 默认情况下返回所有情况下的匹配计数

ResultProxy.rowcount仅与UPDATE或DELETE语句结合使用。与PythonDBAPI所说的相反,它确实做到了 不返回选择结果中可用的行数 语句作为DBAPI,当行为 无缓冲

ResultProxy.rowcount可能无法完全由所有方言实现。特别是,大多数DBAPI不支持聚合行计数结果 来自一个执行官的电话。ResultProxy.supports_sane_rowcount和ResultProxy.supports_sane_multi_rowcount方法将从中报告 如果已知支持每种用法,则为方言

使用RETURNING的语句可能不会返回正确的行数。 你可以用这个:

rowcount = len(results._saved_cursor._result.rows)
那么您的代码将被删除

print '%s rows returned by query...\n' % rowcount
print results.keys()
仅测试“查找”查询


这对我很有用。

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