2012-10-30 12 views
9

Qualcuno sa come ottenere il conteggio delle righe da una query Alchemy SQL oggetto ResultProxy senza eseguire il ciclo attraverso il set di risultati? L'attributo ResultProxy.rowcount mostra 0, mi aspetto che abbia un valore di 2. Per gli aggiornamenti mostra il numero di righe interessate che è quello che mi aspetterei.SQL Alchemy ResultProxy.rowcount non dovrebbe essere zero

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) 

uscita:

0 rows returned by query... 

[u'val'] 
(1,) 
(2,) 

risposta

14

resultproxy.rowcount è in definitiva un proxy per la cursor.rowcount attributo DBAPI. La maggior parte dei DBAPI non fornisce il "conteggio delle righe" per una query SELECT tramite questo attributo; il suo scopo principale è fornire il numero di righe corrispondenti da un'istruzione UPDATE o DELETE. Un database relazionale infatti non sa quante righe verrebbero restituite da una particolare istruzione fino a quando non ha terminato di localizzare tutte quelle righe; molte implementazioni DBAPI inizieranno a restituire le righe man mano che il database le trova, senza buffering, quindi in questi casi non è nemmeno disponibile un conteggio di questo tipo.

Per ottenere il conteggio delle righe restituite da una query SELECT, è necessario eseguire SELECT COUNT (*) in primo piano oppure è necessario recuperare tutte le righe in un array ed eseguire len() sull'array.

Le note a ResultProxy.rowcount discutono questa ulteriore (http://docs.sqlalchemy.org/en/latest/core/connections.html?highlight=rowcount#sqlalchemy.engine.ResultProxy.rowcount):

Note riguardanti ResultProxy.rowcount:

  • Questo attributo restituisce il numero di righe abbinato, che non è necessariamente lo stesso del numero di righe che sono stati effettivamente modificati - un'istruzione UPDATE, per esempio, possono avere nessuna variazione netta su una data riga se i valori SET forniti sono gli stessi di quelli presenti nella riga già. Tale riga sarebbe stata abbinata ma non modificata. Nei backend che dispongono di entrambi gli stili, ad esempio MySQL, il conteggio delle righe è configurato da default per restituire il conteggio delle corrispondenze in tutti i casi.

  • ResultProxy.rowcount è solo utile in combinazione con un'istruzione UPDATE o DELETE. Contrariamente a quanto dice il DBAPI di Python, lo standard non restituisce il numero di righe disponibili dai risultati di un'istruzione SELECT poiché DBAPI non supporta questa funzionalità quando le righe sono senza buffer .

  • ResultProxy.rowcount potrebbe non essere completamente implementato da tutti i dialetti. In particolare, la maggior parte dei DBAPI non supporta un risultato di conteggio aggregato da una chiamata in esecuzione. I metodi ResultProxy.supports_sane_rowcount() e ResultProxy.supports_sane_multi_rowcount() riporteranno da il dialetto se ogni utilizzo è noto per essere supportato.

  • Le istruzioni che utilizzano RESTITUZIONE potrebbero non restituire un conteggio di riga corretto.
1

Si potrebbe usare questo:

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

Poi il codice sarà

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

Solo testato 'trovare' interroga

Funziona per me.