2013-05-15 11 views
21

Mam instrukcji SQL, która zwraca żadnych trafień. Na przykład 'select * from TAB where 1 = 2'.Python, jak sprawdzić, czy zestaw wyników jest pusty?

Chcę sprawdzić, ile wierszy są zwracane,

cursor.execute(query_sql) 

rs = cursor.fetchall() 

Tutaj mam już wyjątek: "(0, 'No ustawić wynik')"

Jak mogę prevend ten wyjątek, check czy zestaw wyników jest pusty?

+0

Jaka jest baza danych? Nie spodziewałbym się tu wyjątku, a '.fetchall()' zwraca pustą listę. –

Odpowiedz

24

cursor.rowcount zostanie ustawiona na 0.

Jeśli jednak używasz oświadczenie, że nigdy zwraca zestaw wyników (takich jak INSERT lub SELECT ... INTO), wtedy nie trzeba zadzwonić .fetchall(); dla takich stwierdzeń nie będzie zestawu wynikowego kiedykolwiek. Wywołanie .execute() wystarczy, aby uruchomić instrukcję.

+1

w moim skrypcie, wykonuję listę instrukcji sql, mierzy ich środowisko wykonawcze i liczbę trafień. Nie mogę wcześniej wiedzieć, czy instrukcja jest wybrana, czy wstawić, czy jest jakiś sposób, aby wiedzieć, po każdym wykonaniu zapytania, czy w ogóle istnieje zestaw wyników? Wielkie dzięki. –

+0

@TaoVenzke: Użyj 'try: results = cursor.fetchall()', a następnie wychwyć wyjątek handler 'except'? Nie wszystkie bazy danych zgłaszają w tym przypadku wyjątek, jakiej bazy danych używasz? –

+0

Używam bazy danych SAP HANA. Zrobiłem to z TRY, a wyjątek został złapany. Ale w tym przypadku chciałbym uniknąć wyjątku. kursor.rowcount jest dość mylące: zwraca -1 dla instrukcji select; zwraca NIE 0 dla instrukcji insert, liczba, którą zwraca, wydaje się być liczbą wstawionych rekordów, ale czy naprawdę mogę jej zaufać? –

11

MySQLdb nie zgłasza wyjątku, jeśli zestaw wyników jest pusty. Dodatkowo funkcja cursor.execute() zwróci długą wartość, która jest liczbą wierszy w pobranym zestawie wyników. Więc jeśli chcesz aby sprawdzić pustych wyników, kod może być ponownie zapisywane jako

rows_count = cursor.execute(query_sql) 
if rows_count > 0: 
    rs = cursor.fetchall() 
else: 
    // handle empty result set 
+0

Działa bardzo dobrze z Oracle! – Gistack

4

Zawiadomienie: To dla modułu MySQLdb w Pythonie.

Dla instrukcji SELECT nie powinno być wyjątku dla pustego zestawu rekordów. Po prostu pusta lista ([]) dla cursor.fetchall() i None dla cursor.fetchone().

Dla każdej innej wypowiedzi, np. INSERT lub UPDATE, który nie zwraca zestawu rekordów, nie można wywoływać na kursorze wartości fetchall() ani fetchone(). W przeciwnym razie zostanie zgłoszony wyjątek.

Jest tylko jeden sposób, aby odróżnić dwóch powyższych typów kursorów:

def yield_data(cursor): 
    while True: 
     if cursor.description is None: 
      # No recordset for INSERT, UPDATE, CREATE, etc 
      pass 
     else: 
      # Recordset for SELECT, yield data 
      yield cursor.fetchall() 
      # Or yield column names with 
      # yield [col[0] for col in cursor.description] 

     # Go to the next recordset 
     if not cursor.nextset(): 
      # End of recordsets 
      return 
0

jeśli łączysz się z bazą danych PostgreSQL, następujące prace:

result = cursor.execute(query) 

if result.returns_rows: 
    # we got rows! 
    return [{k:v for k,v in zip(result.keys(), r)} for r in result.rows] 
else: 
    return None 
0

Można zrobić tak :

count = 0 
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};" 
         "Server=serverName;" 
         "Trusted_Connection=yes;") 
cursor = cnxn.cursor() 
cursor.execute(SQL query) 
for row in cursor: 
    count = 1 
    if true condition: 
     print("True") 
    else: 
     print("False") 
if count == 0: 
    print("No Result") 

Dzięki :)

+0

Publikując odpowiedź, spróbuj wyjaśnić, dlaczego ta odpowiedź rozwiązuje problem wraz z samym kodem. – David

Powiązane problemy