Sensordaten in mariaDB-Server einfügen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
tzabbi

Danke! Nein hatte ich nicht werde ich dann gleich machen .
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Antworten