Insert or Update in DB schlägt fehl ("NULL" Werte)

  • <p>Hallo zusammen</p>
    <p>Aktuell verusche ich aus Werte aus einer Tabelle in eine andere Tabelle zu verschieben.<br>Leider ist das aktuelle Vorhaben nicht von Erfolg gekrönt, dia einige meiner Fehlder "NULL" Werte enthalten, kann Python das nicht konvertieren und als float in der neuen Tabelle abspeichern. Somit bricht es mit einer Fhlermeldung ab...</p>
    <p>Anbei noch der Code-Ausschnitt aus dem Script.<br></p>
    <pre data-file="" data-highlighter="php" data-line="1">cur_PI = db_PI.cursor()
    # Batterie 2 Werte:
    Batt_2_Tranche=""
    while True:
    try:
    #Execute the SQL command
    query=("SELECT Datum,UnixZeit, max(BatterieSpannung), max(BatterieStrom), max(PanelSpannung), max(PanelLeistung) FROM SolarAnlage where UnixZeit &gt; %s and UnixZeit &lt; %s group by Datum")
    cur_PI.execute(query, (Letztes_UnixDatum,unix))
    # cur_PI.execute(query, (1500606400,unix))
    Batt_2_Tranche = cur_PI.fetchall()
    print "Abfrage erfolgreich"
    except:
    # Rollback in case there is any error
    print "Abfrage fehlgeschlagen"
    cur_PI.close()
    db_PI.close
    break
    for data in Batt_2_Tranche:
    # print str(data[0]) +";"+ str(data[1]) +";"+ str(float(data[2])) +";"+ str(float(data[3])) +";"+ str(float(data[4])) +";"+ str(float(data[5]))
    # Werte einfügen
    cur_PI = db_PI.cursor()
    #Daten in MySQL schreiben
    while True:
    sql = (""" INSERT INTO Statistik (Datum,UnixDatum,BattV_max,BattI_max,PanelV_max,PanelW_max) VALUES (%s,%s,%s,%s,%s,%s) ON DUPLICATE KEY UPDATE BattV_max=(%s),BattI_max=(%s),PanelV_max=(%s),PanelW_max=(%s) """, (data[0], data[1], float(data[2]), float(data[3]), float(data[4]), float(data[5]),float(data[2]),float(data[3]),float(data[4]),float(data[5])))
    # print sql
    try:
    # print "Writing to database..."
    #Execute the SQL command
    cur_PI.execute(*sql)
    #Commit your changes in the database
    db_PI.commit()
    print "Write Complete"
    except:
    # Rollback in case there is any error
    db_PI.rollback()
    print "Failed writing to database"
    cur_PI.close()
    break
    [/php]
    Die Ausgegebene Fehlermeldung lautet:
    [code]TypeError: float() argument must be a string or a number</pre>
    <p>Wie kriege ich diese Fehlermeldung weg? Kann ich wieterhin auf float(data[x]) zugreifen oder muss ich etwas anders verwenden, sprich die Rückgabe vom SQL zuerst auf gültigkeit prüfen und erst dann übergeben?</p>
    <p>Gruss Dani</p>

  • Insert or Update in DB schlägt fehl ("NULL" Werte)? Schau mal ob du hier fündig wirst!

  • Hallo Dani !

    Eine Möglichkeit wäre, schon bei der Erstellung der Tabelle einem Tabellenfeld einen eindeutigen Defaultwert zuzuweisen, der später als Fehler erkannt wird, weil er ausserhalb des möglichen Bereiches liegt. z.B:
    CREATE TABLE solardata (
    ....
    leistung INT DEFAULT ’29999’,
    .....
    )
    Wenn die höchste leistung 10000 beträgt ist der Wert 29999 (im Gegensatz von 0) fehlerhaft, und kann ausgefiltert werden.


    Servus !

    RTFM = Read The Factory Manual, oder so

    Einmal editiert, zuletzt von RTFM (26. September 2017 um 21:23)

  • Ich denke du meinst diese Zeile:

    Python
    sql = (""" INSERT INTO Statistik (Datum,UnixDatum,BattV_max,BattI_max,PanelV_max,PanelW_max) VALUES (%s,%s,%s,%s,%s,%s) ON DUPLICATE KEY UPDATE BattV_max=(%s),BattI_max=(%s),PanelV_max=(%s),PanelW_max=(%s) """, (data[0], data[1], float(data[2]), float(data[3]), float(data[4]), float(data[5]),float(data[2]),float(data[3]),float(data[4]),float(data[5])))

    ? Dann mach doch sowas: statt float try_float und die Funktion so:

    Python
    def try_float(value):
        try:
            return float(value)
        except TypeError:
            return None # oder "NULL", wie du es brauchst um in die andere DB NULL zu schreiben...
            # Edit: None scheint schon richtig zu sein: https://stackoverflow.com/a/14370784/5952681

    Oder verstehe ich dich falsch?

  • Also ich würde die umwandlung in Float in eine Funktion auslagern.

    Dort in einem try/execpt Block die Float Konvertierung durchführen, die TypeError Exeption abfangen und prüfen ob "NULL" als Inhalt ist, wenn ja NULL so lassen, wenn nein hast du wirklich einen Fehler :)


    EDIT: Linusg war schneller und schöner

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!