2012-10-30 18 views
9

Czy ktoś wie, jak uzyskać liczbę wierszy z obiektu zapytań SQL Alchemia ResultProxy bez przechodzenia przez zestaw wyników? Atrybut ResultProxy.rowcount pokazuje 0, spodziewałbym się, że będzie miał wartość 2. Dla aktualizacji pokazuje liczbę uszkodzonych wierszy, co jest tym, czego oczekiwałbym.SQL Alchemia ResultProxy.rowcount nie powinna być zerem

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) 

wyjściowa:

0 rows returned by query... 

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

Odpowiedz

14

resultproxy.rowcount jest ostatecznie proxy dla cursor.rowcount atrybutu DBAPI. Większość DBAPI nie zapewnia "liczby wierszy" dla zapytania SELECT za pośrednictwem tego atrybutu; jego głównym celem jest podanie liczby wierszy zgodnych z instrukcją UPDATE lub DELETE. Relacyjna baza danych nie wie, ile wierszy zostanie zwróconych przez określoną instrukcję, dopóki nie zakończy wyszukiwania wszystkich tych wierszy; wiele implementacji DBAPI zacznie zwracać wiersze, ponieważ baza danych je znajdzie, bez buforowania, więc taka liczba nie jest nawet dostępna w tych przypadkach.

Aby uzyskać liczbę wierszy, które zwróci zapytanie SELECT, musisz wykonać SELECT COUNT (*) z góry lub musisz pobrać wszystkie wiersze do tablicy i wykonać len() w tablicy.

Uwagi w ResultProxy.rowcount omówić dalej (http://docs.sqlalchemy.org/en/latest/core/connections.html?highlight=rowcount#sqlalchemy.engine.ResultProxy.rowcount)

Uwagi dotyczące ResultProxy.rowcount:

  • Ten atrybut zwraca liczbę wierszy dopasowane, co niekoniecznie jest taka sama jak liczba wierszy, które zostały faktycznie zmodyfikowanej - instrukcja UPDATE, na przykład, może mieć brak zmiany netto w danym wierszu, jeśli podane wartości SET są takie same, jak te obecne w wierszu już. Taki rząd byłby dopasowany, ale nie zmodyfikowany. Na serwerach zaplecza , które zawierają oba style, takie jak MySQL, rowcount jest skonfigurowany przez domyślnie, aby zwracać liczbę meczów we wszystkich przypadkach.

  • WynikProxy.rowcount to tylko użyteczny w połączeniu z instrukcją UPDATE lub DELETE. W przeciwieństwie do tego, o czym mówi DBAPI w Pythonie, nie zwraca liczby wierszy dostępnych z wyników instrukcji SELECT , ponieważ interfejsy DBAPI nie obsługują tej funkcji, gdy wiersze są niebuforowane w wierszach .

  • WynikProxy.rowcount może nie zostać w pełni zaimplementowany przez wszystkie dialekty. W szczególności większość interfejsów DBAPI nie obsługuje sumarycznego wyniku liczby wierszy z wywołania executemany. Metody ResultProxy.supports_sane_rowcount() i ResultProxy.supports_sane_multi_rowcount() będą raportować od dialektu, jeśli wiadomo, że każde użycie jest obsługiwane.

  • Oświadczenia, które używają POWROTU, mogą nie zwracać prawidłowego liczby wierszy.
1

Można to wykorzystać:

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

Wtedy twój kod będzie

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

tylko przetestowane 'odnaleźć' odpytuje

to działa na mnie.

Powiązane problemy