it-swarm.com.de

Python, wie kann man überprüfen, ob eine Ergebnismenge leer ist?

Ich habe eine SQL-Anweisung, die keine Treffer zurückgibt. Zum Beispiel 'select * from TAB where 1 = 2'.

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

cursor.execute(query_sql)

rs = cursor.fetchall()

Hier bekomme ich schon Ausnahme: "(0, 'Keine Ergebnismenge')" 

Wie kann ich diese Ausnahme verhindern, überprüfen, ob die Ergebnismenge leer ist?

27
Tao Venzke

cursor.rowcount wird normalerweise auf 0 gesetzt.

Wenn Sie jedoch eine Anweisung ausführen, die never eine Ergebnismenge zurückgeben würde (z. B. INSERT ohne RETURNING oder SELECT ... INTO), müssen Sie .fetchall() nicht aufrufen. Es wird keine Ergebnismenge für solche Anweisungen geben. Der Aufruf von .execute() reicht aus, um die Anweisung auszuführen.


Beachten Sie, dass Datenbankadapter auch die Zeilenanzahl auf -1 setzen dürfen, wenn der Datenbankadapter die genaue betroffene Anzahl nicht ermitteln kann. Siehe PEP 249 Cursor.rowcount-Spezifikation :

Das Attribut ist -1, falls am Cursor kein .execute*() ausgeführt wurde oder die Zeilenzahl der letzten Operation nicht von der Schnittstelle bestimmt werden kann.

Die Bibliothek sqlite3 neigt dazu. In allen diesen Fällen müssen Sie, wenn Sie die betroffene Zeilenzahl im Vorfeld kennen müssen, zuerst in derselben Transaktion eine COUNT() select ausführen.

32
Martijn Pieters

MySQLdb löst keine Ausnahme aus, wenn die Ergebnismenge leer ist. Darüber hinaus gibt die Cursor.execute () - Funktion einen langen Wert zurück, der die Anzahl der Zeilen in der abgerufenen Ergebnismenge darstellt. Wenn Sie also nach leeren Ergebnissen suchen möchten, kann Ihr Code als neu geschrieben werden

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

Ich hatte Probleme mit der Zeilenanzahl, die immer -1 zurückgab, egal welche Lösung ich versuchte.

Ich habe im Folgenden einen guten Ersatz gefunden, um nach einem Null-Ergebnis zu suchen.

c.execute("SELECT * FROM users WHERE id=?", (id_num,))
row = c.fetchone()
if row == None:
   print("There are no results for this query")
6
Piney

Hinweis: Dies ist für das MySQLdb-Modul in Python.

Bei einer SELECT-Anweisung sollte es für ein leeres Recordset keine Ausnahme geben. Nur eine leere Liste ([]) für cursor.fetchall() und None für cursor.fetchone().

Für jede andere Aussage, z. INSERT oder UPDATE, die kein Recordset zurückgeben, können Sie weder fetchall() noch fetchone() am Cursor aufrufen. Andernfalls wird eine Ausnahme ausgelöst.

Es gibt eine Möglichkeit, zwischen den beiden oben genannten Cursorarten 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
4
Rockallite

wenn Sie eine Verbindung zu einer Postgres-Datenbank herstellen, funktioniert Folgendes:

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
Ryan Tuck

Das kannst du so machen:

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

Vielen Dank :)

0