Leere Rückmeldung abfangen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Hallo,
wenn ich als Ergebnis einer mySql Abfrage ein leeres Ausgabe erhalte, wie kann ich dieses dann abfangen?

Code: Alles auswählen

result = cursor.fetchall()
print (result)
        

if not result:
    print ("Null")
            
else:
    print ("Ausgabe")
Werden Daten zurückgeliefert sieht die Ausgabe so aus:
result: [(2020, Decimal('72082'), 3)]
Ausgabe

Ohne Daten erhalte ich:
result: [(None, None, None)]
Ausgabe

Ich stehe mal wieder auf dem Schlauch und komme nicht weiter
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

Das liegt an Deiner SQL-Abfrage, dass Du dreimal None bekommst, und genau das kannst Du doch auch abfragen. Da Deine Abfrage genau einen Eintrag als Ergebnis hat, solltest Du fetchone benutzen.

Zwischen print und ( gehört kein Leerzeichen.
Benutzeravatar
__blackjack__
User
Beiträge: 13135
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei dreimal `None` komisch aussieht. Wir kommt das denn zustande?
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

Mit dem Weglassen des Leerzeichens entfällt die [].
Leider bleibt die Ausgabe aber weiterhin fehlerhaft.

Scheinbar ist das "None" auch ein Ergebnis:

result: (None, None, None)
Ausgabe

Gibt es noch eine Lösung?

@__blackjack__: Wenn ein Datensatz drin ist, werden drei Werte ausgegeben. Daher vermutlich die drei None
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, bei fetchone gibt es keine Liste mehr. Das ist ja auch der Sinn der Sache. Du hast in Deinem SQL-Ausdruck, den Du ja geheim hältst, Aggregationsfunktionen, die natürlich NULL ergeben, wenn kein Element gefunden wird. Die Lösung habe ich Dir auch schon geschrieben: Prüfe auf None.
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

na ja, so geheim ist der SQL-Ausdruck gar nicht.
Wollte nur keine überflüssigen Information beschreiben:

Code: Alles auswählen

        suche_Vormonat = 'SELECT YEAR(Datum) as "Jahr_", sum(Laufzeit), Day(Datum) as "Tag" FROM `Wasserstand` WHERE Month(Datum) = ' + Vormonat + ' and YEAR(Datum) = ' + akt_Jahr
        
        connection = mc.connect (host = "192.168.0.200", user = "root", passwd = "", db = "Steuerung")
        cursor = connection.cursor()
        cursor.execute(suche_Vormonat)

        result = cursor.fetchone()
        print("result: ",result)
        

        if result == None:
            print("Null")
            
        else:
            print("Ausgabe")
Suchen nach None, wie hier hat leider auch nichts gebracht
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Aha. Es ist wohl wieder die passende Jahreszeit hierfür:
Bild
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast ja auch ein Tuple mit DREI Werten, und nicht einmal None. SQL-Statements stückelt man nicht mit Strings und + zusammen, sondern benutzt Platzhalter.
Das Jahr_ und der Tag sind irgendwie unsinnig, ersteres, weil das ja auch reingesteckt wird, zweiteres, weil zusammen mit `sum` nur einen beliebigen Tag liefert.
Warum hat Jahr_ einen Unterstrich?
Duesentrieb
User
Beiträge: 52
Registriert: Sonntag 16. März 2014, 17:14

ok. - Habs jetzt aber gelöst
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

Da Du Deine Lösung nicht postest, mach ich das mal

Code: Alles auswählen

        sql_gesamtlaufzeit = 'SELECT sum(Laufzeit) FROM `Wasserstand` WHERE Month(Datum) = %s and YEAR(Datum) = %s'
        
        connection = mc.connect (host="192.168.0.200", user="root", passwd="", db="Steuerung")
        cursor = connection.cursor()
        cursor.execute(sql_gesamtlaufzeit, [vormonat, aktuelles_jahr])

        gesamtlaufzeit = cursor.fetchone()[0]
        print("result: ", gesamtlaufzeit)
        
        if gesamtlaufzeit is None:
            print("Null")
        else:
            print("Ausgabe")
Antworten