Seite 1 von 1

Sensordaten in mariaDB-Server einfügen

Verfasst: Dienstag 1. Mai 2018, 07:18
von tzabbi
Moin Leute,

ich habe ein kleines Problem wobei mir google noch nicht so richtig helfen konnte, da ich noch am Anfang meiner Programmierkarriere stehe.

Ich möchte über einen DHT22 Temperatur- und Luftfeuchtigkeitssensor, die Temperatur und Luftfeuchtigkeit in eine Datenbank schreiben.

Jedoch kommt immer wenn ich die Variable in meinen Insert befehl schreibe folgende Fehlermeldung:
Traceback (most recent call last):
File "dht22.py", line 35, in <module>
cursor.execute(insert)
File "/usr/local/lib/python2.7/dist-packages/mysql/connector/cursor.py", line 392, in execute
self._handle_result(self._connection.cmd_query(stmt))
File "/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", line 523, in cmd_query
statement))
File "/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", line 445, in _handle_result
raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''INSERT INTO daten (s_id, t, f) VALUES (%s, %s, %s)', (1, '25.00', '33.30'))' at line 1
Das dazugehörige pythonSkript:

Code: Alles auswählen

import Adafruit_DHT
import time 
import mysql.connector as mc

from datetime import datetime
 
sensor = Adafruit_DHT.DHT22
 
# 1-Wire-Pin. BCM-Bezeichnung nutzen!
pin = 4
while True:
    humidity, temperature = Adafruit_DHT.read(sensor, pin)
    if humidity is not None and temperature is not None:
        #Sensordaten abfragen
        f = open('log.txt', 'a')
        f.write('Temp={0:0.1f}*C'.format(temperature))
        f.write(' ')
        f.write('Humidity={0:0.1f}%'.format(humidity))
        f.write(' ')
        f.write(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        f.write('\n')
        f.close()
        #Verbindung zum mySQL-Server und Datensatz eintragen
        connection = mc.connect(host = "IP-Adresse",
                                     user = "user",
                                   passwd = "password",
                                       db = "database")
        cursor = connection.cursor()
        temperature = '%.2f' % temperature
        humidity = '%.2f' % humidity
        print temperature
        print humidity
         insert = ("""INSERT INTO daten (sender_id, temperatur, luftfeuchtigkeit) VALUES (%s, %s, %s)""" 
                 ,(1, temperature, humidity))
        cursor.execute(insert)
        connection.commit()
        cursor.close()
        connection.close()
        time.sleep(60)
    else:
        print "Lesefehler. Erneut versuchen!"
        time.sleep(2)
Ich hoffe ich habe alles notwendige beschrieben und bedanke mich schon für jeden, der sich Zeit nimmt um mir zu helfen.

VG
tzabbi

Re: Sensordaten in mariaDB-Server einfügen

Verfasst: Dienstag 1. Mai 2018, 08:46
von __deets__
Execute ist eine Methode die 2 Argumente nehmen kann, wenn man sie mit Parametern aufruft. Du rufst sie aber mit EINEM argument, nämlich einem Tupel, auf. Du musst also gleich execute aufrufen, statt deine insert-Variable zu nehmen.

Re: Sensordaten in mariaDB-Server einfügen

Verfasst: Dienstag 1. Mai 2018, 09:49
von tzabbi
Super vielen Dank! Jetzt funktioniert es!

Könntest Du mir zum Abschluss bitte noch erklären, wieso ich die %s benutze anstatt die Variablen gleich reinzuschreiben?

VG tzabbi

Re: Sensordaten in mariaDB-Server einfügen

Verfasst: Dienstag 1. Mai 2018, 09:57
von __deets__
Hast du mal die Dokumentation von cursor.execute bemüht? Da sollte das diskutiert sein. Die Kurzfassung: so nutzt du die Sicherheitsfunktionen des SQL Treibers und wandeltest Typen korrekt um.

Re: Sensordaten in mariaDB-Server einfügen

Verfasst: Dienstag 1. Mai 2018, 13:02
von tzabbi
Danke! Nein hatte ich nicht werde ich dann gleich machen .

Re: Sensordaten in mariaDB-Server einfügen

Verfasst: Mittwoch 2. Mai 2018, 20:12
von Sirius3
@tzabbi: mal nimmst Du format, dann strftime dann %. Formatiere einheitlich mit .format. Die Datenbank erwartet hoffentlich Zahlen, da macht das konvertieren in String keinen Sinn.