Meswert in Datenbank einfügen

  • Morgen Forum

    Ich komme einfach nicht weiter mit meinen Versuch aktuelle Werte in ein Datenbank zu schreiben.
    Es wird eine SQLite Datenbank erstellt, dann eine Tabelle und in diese Tabelle möchte ich gerne aktuelle Werte eintragen.
    Gebe ich diese Werte wie unten im CODE eingetragen vor (z.B: hier cpu_temp = 24 und raum_temp = 45) werden diese Werte auch übernommen und ich kann sie aus der Tabelle abrufen.
    So wie hier eingtragen im Code erhalte ich beim abfragen der Datenbank:

    CPU = 24 RAUM = 45 SENSOR = DS1820 STANDORT = KELLER

    ändere ich diese Werte im CODE auf z.B:
    connection.execute("INSERT INTO messWerte (cpu_temp, raum_temp, sensor_art, standort) \
    VALUES (10, 100, 'DS1820', 'Keller' )");

    bekomme ich bei der Abfrage auch diese Änderung:
    CPU = 10 RAUM = 100 SENSOR = DS1820 STANDORT = KELLER

    Im Programm selber habe ich eine Variable temp_CPU in der die aktuelle CPU Temperatur eingefügt wird.
    Diese kann ich mir mittels print anzeigen.
    Möchte ich aber den Werte z.B. aus dieser Variablen auslesen

    hier die Änderung:
    connection.execute("INSERT INTO messWerte (cpu_temp, raum_temp, sensor_art, standort) \
    VALUES (temp_CPU, 45, 'DS1820', 'Keller' )");

    wird das Programm mit folgener Meldung abgebrochen:


    Datenbank vorhanden

    Tabelle wird erzeugt
    36
    1
    36
    Traceback (most recent call last):
    File "temp.py", line 117, in <module>
    VALUES (temp_CPU, 45, 'DS1820', 'Keller' )");
    sqlite3.OperationalError: no such column: temp_CPU

    Hier nochmals die Code Zeilen für diese Aufgabe:


    Gruß aus Dorsten
    Herbert

  • Innerhalb der Anführungszeichen wird Dein Variablenname als Text interpretiert und direkt ins SQL-Statement übernommen. Du möchtest aber den Variablenwert verwenden. Versuch's mal so:

    Code
    connection.execute("INSERT INTO messWerte (cpu_temp, raum_temp, sensor_art, standort) \
              VALUES (%i, 45, 'DS1820', 'Keller' )" % temp_CPU);
  • Hallo Manual

    Vielen Dank hat geklappt.
    Jetzt muss ich aber erstmal noch sehen und verstehen was ich falsch gemacht habe.

    Nochmals Danke für die schnelle Hilfe

    Gruß aus Dorsten
    Herbert
    Automatisch zusammengefügt:
    Hallo Forum
    @ Manul

    Du hast mir ja gerade geschrieben:"Innerhalb der Anführungszeichen wird Dein Variablenname als Text interpretiert.....".
    Ich habe angenommen weil ich die beiden Bezeichnungen DS1820 und Keller in Hochkomma setze wäre das schon so richtig und die Varibalen werden ohne eingesetz wie ich es bei der PRINT Anweisung mache.
    VALUES (temp_CPU, 45, [font="Arial Black"]'DS1820', 'Keller' [/font])" ????????

    Gruß aus Dorsten
    Herbert

    Einmal editiert, zuletzt von Msdeljh (15. Oktober 2016 um 10:04)

  • Hallo,

    Zitat

    Ich habe angenommen weil ich die beiden Bezeichnungen DS1820 und Keller in Hochkomma setze wäre das schon so richtig und die Varibalen werden ohne eingesetz


    Kleiner Denkfehler deinerseits: der ganze SQL-Befehl ist ja schon ein String, eingeschlossen von Doublequotes "". Von daher wird `temp_CPU` ganz normal als Text / Teil des Strings interpretiert.

    Gruß, noisefloor

  • Hallo noisefloor

    Hatte jetzt auf die Doublequotes nicht geachtet und mich förmlich nur auf schreibweise innerhalb der Klammer "aufgehalten".
    Möchte jetzt natürlich sehen ob ich den anderen Wert des Raumes auch eingfügt bekomme.

    Danke und Gruß aus Dorsten
    Herbert

  • Hallo,

    die erste Varianten öffnet Tür und Tor für SQL-Injections. Die zweite Variante ist dagegen sicher, weil das Python-Modul, was sich um die DB-Anbindung kümmert, erst die Daten, die am Platzhalter eingesetzt werden sollen, prüft und ggf. unterbindet.

    bootsmann: das `%s` ist ja nicht per se schlecht - bei beim mysqlDB-Modul ist das Standard, AFAIK. Es geht ja eher um das "wie" der Platzhalterersetzung, als einfaches Ersetzen im String vs. via DB API 2.0 konformen Weg.

    Gruß, noisefloor

  • Eine Google Suche nach "python mysql variable" liefert als ersten Treffer: http://stackoverflow.com/a/775399

    Das erste (incorrect) ersetzt oder fügt direkt ein. Deshalb gilt das auch als unsicher, weil es keinerlei Kontrolle/Überprüfung/Filterung unterzogen wird.
    Verarbeitung durch Python selbst.

    Das zweite übergibt es als Tuple an die Funktion beziehungsweise Methode, als weiteren Parameter, deshalb kann es dort dann escaped/gefiltert werden. Ähnlich wie in python3: print("bla", end="") ... wobei "bla" das erste und end="" das zweite Parameter wäre was an die print Funktion übergeben wird.
    Verarbeitung durch das jeweiligen Module/Funktion/Methode.

    Bei SQL gilt " % " als Wildcard: *

  • Hallo Forum

    Leider komme ich nicht weiter um einen weiteren Wert in die Datenbank zu schreiben.
    Hier ist nochmals der gänderte Code(als Beispiel möchte ich gerne die Bezeichnung des Sensor eintragen):

    Fehlermeldung:
    TypeError: 'str' object is not callable

    Ich hatte auch versucht einen zusätzlichen Wert einzutragen aber das Programm stürzt dann ab.
    Lasse ich den letzten Wert weg klappt es.

    Code
    cursor.execute("""CREATE TABLE IF NOT EXISTS messWerte
           (id INTEGER PRIMARY KEY, \
           temp_cpu, \
           temp_raum, \
           timestamp) \
    ;""")
    
    
    cursor.execute("INSERT INTO messWerte (temp_cpu, temp_raum, timestamp, bezeichnung) \
           VALUES (?,?,?,?);", (temp_CPU,temp_RAUM,time.time()))

    Gruß aus Dorsten
    Herbert

  • Hallo Forum

    Hier ist der Code

    Gruß Herbert

  • wo kommst du nicht mehr weiter? Formuliere die Frage präzise. Anbei ein paar Verbesserungen. Nutze zB auch den ``with`` Ausdruck.

Jetzt mitmachen!

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