SQL Alchemy ResultProxy.rowcount不应为零

时间:2012-10-30 18:05:31

标签: 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: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,)

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

仅测试了“查找”查询

它对我有用。