2013-05-15 9 views
21

Ho una dichiarazione SQL che non restituisce risultati. Ad esempio, 'select * from TAB where 1 = 2'.Python, come verificare se un set di risultati è vuoto?

voglio controllare il numero di righe restituiti,

cursor.execute(query_sql) 

rs = cursor.fetchall() 

Qui ricevo già un'eccezione: "(0, 'No set di risultati')"

Come posso prevend questa eccezione, Assegno se il set di risultati è vuoto?

+0

Che database è questo? Non mi aspetterei un'eccezione qui, piuttosto '.fetchall()' restituisce una lista vuota. –

risposta

24

cursor.rowcount sarà impostato a 0.

Se, tuttavia, si sta eseguendo una dichiarazione che sarebbe mai restituire un set di risultati (ad esempio INSERT o SELECT ... INTO), quindi non è necessario chiamare .fetchall(); non ci sarà un set di risultati mai per tali dichiarazioni. Chiamare .execute() è sufficiente per eseguire l'istruzione.

+1

nel mio script, eseguo un elenco di istruzioni sql, misurano il loro runtime e il numero di hit. Non posso sapere in anticipo se una dichiarazione è selezionata o inserita, c'è un modo per me di sapere dopo ogni esecuzione della query se c'è un set di risultati? Molte grazie. –

+0

@TaoVenzke: Usa 'provare: risultati = cursor.fetchall()' poi prendere l'eccezione con un gestore di 'except'? Non tutti i database generano un'eccezione in questo caso, quale database stai usando qui? –

+0

Sto usando il database SAP HANA. L'ho fatto con TRY e viene rilevata un'eccezione. Ma vorrei evitare un'eccezione in questo caso. cursore.il conteggio delle righe è abbastanza confuso: restituisce -1 per l'istruzione selezionata; restituisce NOT per l'istruzione insert, il numero che restituisce sembra essere il numero di record inseriti, ma posso davvero fidarmi? –

11

MySQLdb non genera un'eccezione se il set di risultati è vuoto. Inoltre, la funzione cursor.execute() restituirà un valore lungo che è il numero di righe nel set di risultati recuperato. Quindi, se si vuole verificare la presenza di risultati vuoti, il codice può essere riscritto come

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

Funziona molto bene con Oracle! – Gistack

4

Avviso: Questo è per il modulo MySQLdb in Python.

Per una dichiarazione SELECT, non dovrebbe esserci un'eccezione per un recordset vuoto. Basta una lista vuota ([]) per cursor.fetchall() e None per cursor.fetchone().

Per qualsiasi altra dichiarazione, per esempio INSERT o UPDATE, che non restituisce un recordset, non è possibile né chiamare fetchall()fetchone() sul cursore. Altrimenti, verrà sollevata un'eccezione.

C'è un modo per distinguere tra questi due tipi di cursori:

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

se ci si collega a un database Postgres, le seguenti opere:

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

Si può fare come questo :

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

Grazie :)

+0

Quando si invia una risposta, provare a spiegare perché questa risposta risolve il problema, insieme al codice stesso. – David