2013-05-15 13 views
21

Ich habe eine SQL-Anweisung, die keine Treffer zurückgibt. Zum Beispiel 'select * from TAB where 1 = 2'.Python, wie überprüft man, ob eine Ergebnismenge leer ist?

Ich möchte, wie viele Zeilen überprüfen zurückgegeben werden,

cursor.execute(query_sql) 

rs = cursor.fetchall() 

Hier bekomme ich schon Ausnahme: „(0,‚Kein Ergebnis gesetzt‘)“

Wie ich diese Ausnahme PREVEND kann, Scheck ob die Ergebnismenge leer ist?

+0

Welche Datenbank ist das? Ich würde hier keine Ausnahme erwarten, sondern '.fetchall()' gibt eine leere Liste zurück. –

Antwort

24

cursor.rowcount wird auf 0

eingestellt werden Wenn Sie jedoch eine Erklärung ausgeführt wird, würde nie eine Ergebnismenge (wie INSERT oder SELECT ... INTO) zurückkehren, dann brauchen Sie nicht .fetchall() zu nennen; Es wird kein Ergebnis jemals für solche Aussagen geben. Der Aufruf von reicht aus, um die Anweisung auszuführen.

+1

in meinem Skript, führe ich eine Liste von SQL-Anweisungen, messen Sie ihre Laufzeit und die Anzahl der Treffer. Ich kann nicht im Voraus wissen, ob eine Anweisung ausgewählt oder eingefügt wird, gibt es eine Möglichkeit für mich, nach jeder Abfrageausführung zu wissen, ob überhaupt eine Ergebnismenge vorhanden ist? Danke vielmals. –

+0

@TaoVenzke: Verwenden Sie 'try: results = cursor.fetchall()' dann fangen Sie die Ausnahme mit einem 'except' Handler? Nicht alle Datenbanken werfen in diesem Fall eine Ausnahme aus, welche Datenbank benutzen Sie hier? –

+0

Ich verwende SAP HANA-Datenbank. Ich habe es mit TRY gemacht, und eine Ausnahme ist gefangen. Aber ich möchte in diesem Fall eine Ausnahme vermeiden. Mauszeiger.rowcount ist ziemlich verwirrend: Es gibt -1 für Select-Anweisung zurück; Es gibt NOT 0 für die INSERT-Anweisung zurück, die zurückgegebene Zahl scheint die Anzahl der eingefügten Datensätze zu sein, aber kann ich ihr wirklich vertrauen? –

11

MySQLdb löst keine Ausnahme aus, wenn die Ergebnismenge leer ist. Zusätzlich gibt die cursor.execute() - Funktion einen langen Wert zurück, der die Anzahl der Zeilen in der abgerufenen Ergebnismenge angibt. Also, wenn Sie für leere Ergebnisse überprüfen möchten, können Sie den Code werden neu geschrieben als

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

Funktioniert sehr gut mit Oracle! – Gistack

4

Hinweis: Dies ist für MySQLdb Modul in Python. Für eine SELECT-Anweisung sollte es keine Ausnahme für ein leeres Recordset geben. Nur eine leere Liste ([]) für und None für cursor.fetchone().

Für jede andere Aussage, z.B. INSERT oder UPDATE, die kein Re-Cord-Set zurückgibt, können Sie weder fetchall() noch fetchone() auf dem Cursor aufrufen. Andernfalls wird eine Ausnahme ausgelöst.

Es gibt einen Weg zwischen den beiden oben genannten Typen von Cursor zu unterscheiden:

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

, wenn Sie auf eine Postgres-Datenbank sich verbinden, die folgenden Werke:

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

Sie mögen dies tun können :

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

Thanks :)

+0

Wenn Sie eine Antwort verfassen, versuchen Sie zu erklären, warum diese Antwort das Problem löst, zusammen mit dem Code selbst. – David