tzabbi
Goto Top

Python Skript kann keine Daten in mysql einfügen

Hallo Leute,

ich bin neu hier und hoffe ich mache alles richtig in meinem ersten Post.
Das Problem ist wie folgt:
Ich habe gestern 2 Raspis aufgesetzt einen mit Webserver und mariadb-Server, welchen ich über PHPmyadmin administriere.
Der andere hat den DHT22 Sensor dran und soll die erfassten Daten in den mysql Server speichern. Die Verbindung wurde erfolgreich hergestellt, ich habe den mysql-Server für externe Zugriffe freigegeben und auch den User freigegeben.
Das python Skript liefert auch keine Fehler zurück und führt alles aus. Nun sehe ich allerdings die Datensätze in der Tabelle meiner Datenbank nicht. Der einzige Hinweis, dass das Skript auch eine Verbindung mit dem mysql Server hatte ist, dass der primary key automatisch hochzählt. Das sehe ich wenn ich manuell über phpmyadmin ein Datensatz hinzufüge (spring nicht um 1 hoch sondern hat dann z.B. statt 4 auf 5 einen Sprung von 4 auf 9). Kann es sein, dass ich noch nicht alle Berechtigungen richtig für den Server eingerichtet habe?

Kennt Ihr das Problem und könnt mir eine Lösung verraten?
Bei weiteren Infos stehe ich euch zur Verfügung! Auch wenn Ihr noch den Quellcode benötigt stelle ich ihn gern zur Verfügung.

Viele Grüße
tzabbi

Content-Key: 372611

Url: https://administrator.de/contentid/372611

Printed on: April 19, 2024 at 03:04 o'clock

Member: falscher-sperrstatus
falscher-sperrstatus Apr 30, 2018 at 16:53:15 (UTC)
Goto Top
Hallo tzabbi,

vermute, dass du schlicht die falschen Commands nutzt, oder die Commands falsch nutzt. Gerne kannst du deinen Code mal posten oder per PN schicken.

VG
Member: tzabbi
tzabbi Apr 30, 2018 at 16:59:33 (UTC)
Goto Top
ich meinte python skript. Ich habe es gerade geändert.

ich poste gleich mal mein python-Skript.

vg tzabbi
Member: tzabbi
tzabbi Apr 30, 2018 updated at 17:51:07 (UTC)
Goto Top
import Adafruit_DHT
import time 
import MySQLdb

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 = MySQLdb.connect(host = "ip-adresse",  
                                       db = "datenbank",  
                                     user = "root",  
                                   passwd = "toor")  
        cursor = connection.cursor()
        print temperature
        print humidity
        cursor.execute("INSERT INTO daten (sender_id, temperature, humidity) VALUES (1, temperature, humidity)" )  
        print  temperature
        print  humidity
        cursor.close()
        cursor.commit()
        time.sleep(60)
    else:
        print "Lesefehler. Erneut versuchen!"  
        time.sleep(2)

Hier mein Quellcode.
Member: Arano
Arano Apr 30, 2018 at 19:39:40 (UTC)
Goto Top
Hallo, Nabend.

cursor.execute("INSERT INTO daten (sender_id, temperature, humidity) VALUES (1, temperature, humidity)" )   
Ich habe mir Phyton noch nicht zugeführt aber musst du nicht auch hier eine Zeichenkette unterbrechen wenn Variablen eingefügt werden sollen ?

~Arano
Member: tzabbi
tzabbi May 01, 2018 at 04:46:56 (UTC)
Goto Top
Wie meinst du das in Anführungsstriche setzen? Es wird ja im Grunde keine Zeichenkette eingefügt sondern ein Double.
Mitglied: 136037
136037 May 01, 2018 updated at 08:08:34 (UTC)
Goto Top
@Arano will auf folgendes hinaus: Wie soll der Interpreter so zwischen Variable und String unterscheiden wenn du den Variablennamen innerhalb von Anführungszeichnen setzt??
Hiermit z.B. setzt du den Inhalt der Variablen an die richtige Stelle.
cursor.execute("INSERT INTO daten (sender_id, temperature, humidity) VALUES (1, {0}, {1})".format(temperature, humidity))   
Oder eben auf die herkömmliche Verkettung mit +
cursor.execute('INSERT INTO daten (sender_id, temperature, humidity) VALUES (1,' +  temperature + ',' + humidity + ')')   
Beachten solltest du natürlich auch wie die Zahlen sich manifestieren, mit Punkt oder Komma und was deine Datenbank hier erwartet.

Aber mal ehrlich, Stringmanipulationen sind doch Python Grundlagen der ersten Stunde ...
https://matthew-brett.github.io/teaching/string_formatting.html
Member: Arano
Arano May 01, 2018 updated at 08:27:36 (UTC)
Goto Top
Moin,

Wie meinst du das in Anführungsstriche setzen?
Ich habe doch gar nichts von Anführungszeichen gesagt !?
Es wird ja im Grunde keine Zeichenkette eingefügt sondern ein Double.
Nein, das ist was du gerne HÄTTEST ;)

In deinem Query hast du ZWEIMAL den Begriff "temerature". Einmal als Feldnamen der DB-Tabelle und einmal als Python-Variable aber wie unterscheiden sie sich !?
Also du hättest gerne dass das 2.temperature als Variable interpretiert wird, weil es aber zwischen zwei doppelten Anführungezeichen steht IST es einfach nur ein Wort und dieses in dem erzeugten SQL-Query ist fehl am Platz !
Mach doch mal ein
print( "INSERT INTO daten (temperature) VALUES (temperature)" )  
die Ausgabe wird sein:
INSERT INTO daten (temperature) VALUES (temperature)
Warum auch sollte das Erste "temperature" anders behandelt werden als das Zweite ?

https://pyformat.info/
"INSERT INTO `data` (`id`,`temperature`,`humidity`) VALUES (1,%f,%f)" % (temperature, humidity)
"INSERT INTO `data` (`id`,`temperature`,`humidity`) VALUES (1,{},{})".format(temperature, humidity)

Hey, cursor.execute() kann das wohl auch von sich aus:
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysql ...
cursor.execute(operation, params=None, multi=False)


~Arano

Edit:
Na da habe ich mich wohl zu lange in den Handbüchern aufgehalten face-smile