2012-10-30 84 views
9

有誰知道如何從一個SQL查詢鍊金術對象ResultProxy行數不通過的結果集循環? ResultProxy.rowcount屬性顯示爲0,我認爲它的值爲2.對於更新,它顯示了受影響的行數,這是我所期望的。SQL鍊金術ResultProxy.rowcount不應該是零

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

engine = create_engine(
    'oracle+cx_oracle://user:[email protected]: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,) 

回答

14

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

- UPDATE語句,例如,可能有

  • 此屬性返回匹配的行數,這是不一定相同實際上修改的行數:

    關於ResultProxy.rowcount注意事項如果給定的SET值與該行中存在的值相同,則在給定行上不會發生淨變化已經有 。這樣的行可以匹配但不能修改。在後端 是擁有兩種風格,如MySQL,行數由 默認配置爲在所有情況下返回匹配計數。

  • ResultProxy.rowcount是只有與UPDATE或DELETE語句結合使用。相反,Python的DBAPI說什麼,但它 沒有返回的行可從SELECT語句 當行是 緩衝DBAPIs不支持此功能的結果的數量。

  • ResultProxy.rowcount並非所有方言全面實施。特別是,大多數DBAPI不支持來自executemany調用的聚合行計數結果 。該ResultProxy.supports_sane_rowcount()和ResultProxy.supports_sane_multi_rowcount()方法將 方言,如果每次使用已知可支持的報告。使用RETURNING

  • 報表可能不會返回正確的行數。
1

您可以使用此:

rowcount = len(results._saved_cursor._result.rows) 

那麼你的代碼將

print '%s rows returned by query...\n' % rowcount 
print results.keys() 

只測試了 '查找' 查詢

這對我的作品。