Datenbank mit Variable aus Python füllen
Hallo,
Ich möchte meine Temperaturmessungen gerne in einer Datenbank speichern. Das ganze System läuft auf einem Raspberry Pi in Python. Wie ich an die Druck und Temperaturdaten hinkomme, weiss ich mittlerweile. Ich habe momentan nur das Problem das bei mir der import von den Zahlen in die Datenbank nicht klappt. Hiereinmal mein Code:
#!/usr/bin/env python
import MySQLdb
db = MySQLdb.connect("localhost", "monitor", "1234", "wetterstation")
curs=db.cursor()
temperature1 = 98 #Momentan meine Variablen, ist später werden dann natürlich die werte aus den Sensoren genommen.
pressure1 = 1001
try:
curs.execute ("INSERT INTO wetterdata values(CURRENT_DATE(), NOW(), 18.2, 18.3)")
db.commit()
print "Data committed"
except:
print "Error: the database is being rolled back"
db.rollback()
So klappt das auch ganz gut, aber sobald ich eben die 18.1 und 18.3 über eine Variable mir rausfische, komme ich zu dem Error.
curs.execute ("INSERT INTO wetterdata (date, time, temperature, pressure) VALUES (CURRENT_DATE(), NOW(), (?), (?))" , (temperature, pressure))
das klappt leider nicht.
So habe ich die Tabelle Created..
CREATE TABLE wetterdata (date DATE, time TIME, temperature NUMERIC, pressure NUMERIC);
Ich bekomme leider auf immer ein error wenn ich die (?) durch %s oder %f oder %d ersetze. Würde mich freuen wenn mir da jemand helfen kann oder mir jemand eine andere Möglichkeit vorzeigt wie man Variablen einfach in eine Datenbank im lokalen Netzwerk bekommt.
Danke, Justin
2 Antworten
Die Frage ist, ob Dein Python überhaupt eine Datenbankanbindung vorgesehen hat. Normalerweise ist das eine Netzwerkverbindung und Deine Python-Entwicklungsumgebung muss diese Anbindung, auch wenn das lokal ist, irgendwie im Programm realisieren. Zum Testen müsste die CONNECT-Anweisung ohne Fehlermeldung akzeptiert werden. Konkret bedeutet das, dass das was Du an die Datenbank sendest auch dort ankommt und die Datenbank Dir eine entsprechende Meldung zurücksendet. Wenn das funktioniert, kann man über die weiteren SQL-Anweisungen diskutieren.
Ja also die Verbindung klappt. Feste Values kann ich übertragen. Ich habe mittlerweile den Fehler gefunden. Die Datenbankspalte für pressure und temperature muss von Decimal auf Float geändert werden. dann gehts.
generell würde ich mir die systemspezifische fehlermeldung ausgeben lassen, wie in http://www.mikusa.com/python-mysql-docs/exceptions.html beschrieben.
lt. beschreibung musst du jedenfalls immer %s statt (?) benutzen (auch für die numerischen felder)
ich weis nicht, ob du da uns in deinem code etwas vorenthalten hast: die variablen temperature, pressure wie im 2. parameter vom execute angegeben sind in deinem code nicht zu sehen, wohl aber temperature1, pressure1 (oder meinst du die etwa?)
Ja Sry, das war wohl in der Eile. Die 1 nach temperature und pressure ist ein fehler. Im script was dem Raspberry gegeben wurde, ist dies natürlich anders geschrieben. Ich wollte mich bei der Frage einfach auf das Wichtigste konzentrieren. Ich habe mittlerweile selber den Fehler gefunden nach vielen Stunden herumprobieren. Der Fehler liegt nicht am Script, sondern an den Einstellungen der Datenbank. Ersteinmal müssen die "(?)" dürch "%s" ersetzt werden. Dann muss man den Fehler beheben wie die Datenbank angelegt wird. Hier nochmal wie ich es gemacht habe:
CREATE TABLE wetterdata (date DATE, time TIME, temperature NUMERIC, pressure NUMERIC);
Das Problem liegt daran dass NUMERIC die Spalte als Decimal definiert. Scheinbar kann weder (?) noch %s die werte korrekt übertragen. Ich habe nun in der Datenbank über die GUI PHPMyAdmin die Decimal in Float geändert und auf einmal ging es mit %s. Bisschen strange das ganze aber so klappt es gut.
Trotzdem danke dass ihr euch mit meinem Problem auseinandergesetzt habt!