Sensordaten in mariaDB-Server einfügen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
tzabbi
User
Beiträge: 14
Registriert: Dienstag 1. Mai 2018, 06:41

Dienstag 1. Mai 2018, 07:18

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: 2975
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 1. Mai 2018, 08:46

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
User
Beiträge: 14
Registriert: Dienstag 1. Mai 2018, 06:41

Dienstag 1. Mai 2018, 09:49

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: 2975
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 1. Mai 2018, 09:57

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
User
Beiträge: 14
Registriert: Dienstag 1. Mai 2018, 06:41

Dienstag 1. Mai 2018, 13:02

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

Mittwoch 2. Mai 2018, 20:12

@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