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: 18319
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: 14211
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei dreimal `None` komisch aussieht. Wir kommt das denn zustande?
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
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: 18319
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: 1532
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: 18319
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: 18319
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