Hallo zusammen,
ich möchte eine Tabelle bei Mysql Workbench erstellen und da meine Daten
vom MQTT speichern.
Momentan übertrage ich die Daten von einem ESP auf meinem Laptop per
MQTT in Pycharm und hole mir den Litervebrauchi-mpulse meines
Wasserzählers..
das klappt bis jetzt leider nicht..
CODE:
1
import datetime
2
import mysql.connector
3
import paho.mqtt.client as mqtt_client
4
5
def connect_mqtt():
6
def on_connect(client, userdata, flags, rc):
7
if rc == 0:
8
print("Connected to MQTT Broker!")
9
print('client')
10
else:
11
print("Failed to connect, return code %d\n", rc)
12
def on_disconnect(client, userdata, rc):
13
print("Client got disconnected")
14
if rc!= 0:
15
print('Unexpected MQTT disconnection, will auto-reconnect')
okey schrieb:> mycursor.execute('INSERT into clienttest(Sensor,LiterVerbrauch,> Date und Time) VALUES (%s, %s, %s)')
Naja, dieses SQL ist bestimmt nicht so gedacht ('Date und Time'). Aber
eine Fehlermeldung waere schon mal nicht schlecht...
Th.
Selten bloede Idee Fehlermeldungen als Graphik zu veroeffentlichen. Der
nonSupportedError waere erstmal mein erster Gedanke (Copy and Paste geht
ja nicht)
Viel Glueck
Th.
habe auch noch keine Erfahrungen mit MySql.. hab aber mysql.connector
installiert und alles bei MySql Workbench vorbereitet.. aber der Code
scheint nicht zu funktionieren
Das macht bei einem Fehler nur einen Rollback, gibt aber keinen Fehler
aus und nichts. Vielleicht die Exception abfangen und ausgeben,
vielleicht mit warnings.warn() oder traceback.print_exc()?
>> Das macht bei einem Fehler nur einen Rollback, gibt aber keinen Fehler> aus und nichts. Vielleicht die Exception abfangen und ausgeben,> vielleicht mit warnings.warn() oder traceback.print_exc()?
Insbesondere wenn start transaction nicht existiert (oder wird das
implizit irgendwo gestartet)?
Gruesse
Th.
okey schrieb:
> mycursor.execute('INSERT into clienttest(Sensor,LiterVerbrauch,> Date und Time) VALUES (%s, %s, %s)')
Die Anzahl der Spalten (erste Klammer) und die der Werte(2 Klammer)
müssen gleich sein.
Es gibt KEINE Programmiersprache wo er Variblen_name mit leerzeichen
gibt.
Und da felder auch eine Art Variable ist, gilt für sie das selbe.
Also gewöhne dir Leerzeichen in Feldern leerzeichen ab. Wenn du sie
unbedingt willst, musst du das SQL mitteilen.
Richtig wäre also :
mycursor.execute('INSERT into clienttest(Sensor,LiterVerbrauch,
'Date und Time') VALUES (%s, %s, %s)')
Man beachte das HOCHkomme bei Date und Time.
Besser wäre es so.
mycursor.execute('INSERT into clienttest(Sensor,LiterVerbrauch,
Date_und_Time) VALUES (%s, %s, %s)')
Unterstrich beachten.
Da ich dein Code nicht kenne, besteht sogar die Möglichkeit das das
Problem auftritt weil eine Tabelle ein Leerzeichen hat.
Merke: Leerzeichen sind in JEDER Programmiersprache böse und sollten NIE
im Code bei Variblen , beschreibungen etc eingesetzt werden. Einzige
Ausnahme : Deklarierter Text und dann in " " eingeschlossen.
Schlaumaier schrieb:> Es gibt KEINE Programmiersprache wo er Variblen_name mit leerzeichen> gibt.
Doch. In Fortran sind Leerzeichen optional überall erlaubt und nirgends
nötig.
Nachtrag:
Der Begriff "valueint" gefällt mir nicht.
Mache folgendes.
Lege die mySQL Datenbank mit einen Feld names ID an. Auto-Vergabe +
Erhöhung, mit einmalig-Parameter.
Dann brauchst du dein Valueint nicht.
Du schreibst die werte einfach mit Insert da rein + gut ist.
Wenn du abfragen für änderungen machen willst, liest du ID mit aus, und
schreibst du änderung mit "where ID = ausgelesenen_id"
okey schrieb:> also ich habe nun so versucht, zwar keine Fehlermeldungen aber auch> keine Datenspeicherung..>>
1
> i = datetime.datetime.now()
Ungeschickter Variablenname... zudem:
> year = str(i.year)> month = str(i.month)> day = str(i.day)> date = day + "-" + month + "-" + year[/code]
Warum? datetime.datetime.now().date().isoformat() würde funktionieren
und hätte vor allem auch den Vorteil, ein standardkonformes und damit
weiter verarbeitbares ISO-Format in die Datenbank zu speichern. Nebenbei
möchte ich anmerken, daß das ISO-Format nicht etwa Tag-Monat-Jahr ist,
sondern exakt umgekehrt Jahr-Monat-Tag. Mit dem, was Du da erzeugst,
kann keine Datenbank umgehen -- und wenn doch, dann ist sie kaputt
(SQLite?).
Außerdem können Datenbankmodule, die kompatibel zu Pythons DBAPI2
(PEP249) [1] sind, für Spalten mit Datums- und/oder Zeittypen natürlich
Parameter der Typen datetime.date, datetime.datetime und datetime.time
verwenden. Kompatible DB-Module liefern diese Datentypen für Datums- und
Zeitspalten sogar automatisch zurück, wenn man sie abfragt.
Nebenbei bemerkt verstehe ich nicht ganz, warum Du Datum und Zeit in
zwei unterschiedlichen Spalten speichern willst. Hat MySQL keine
Spaltentypen wie DATETIME und / oder TIMESTAMP, die das in einer Spalte
speichern?
Noch besser wäre es allerdings, die Funktionalität der Datenbank zu
nutzen, bei MySQL IIRC die Funktion "NOW()" -- die kann man entweder als
DEFAULT-Wert für die Spalte setzen, oder explizit im INSERT verwenden.
Zuletzt sei noch angemerkt, daß MQTT-Broker ihre Daten in der Regel
nicht speichern, einige kann man allerdings anweisen, das zu tun. Wenn
Dein Broker die Daten nicht speichert und es treffen neue Daten ein,
während Dein Python-Skript nicht läuft oder es womöglich anderweitig
beschäftigt ist, dann sind diese Daten unwiederbringlich verloren. Wenn
das nicht passieren darf, ist eine Message-Queue vielleicht die bessere
Lösung. In der Sparte dürfte Apache Kafka der Platzhirsch sein, aber
auch RabbitMQ, ZeroMQ, NSQ und Redis Streams haben ihre Freunde und
Anwendungsfälle.
[1] https://peps.python.org/pep-0249/
Thomas W. schrieb:> Insbesondere wenn start transaction nicht existiert (oder wird das> implizit irgendwo gestartet)?
Wenn der Client etwas in der Datenbank verändert, muß er nach DBAPI2 auf
die Methode commit() des Connection-Handle aufrufen. Das ist insofern
auch korrekt, als der ANSI/ISO-Standard einen impliziten Start der
Transaktion mit einem expliziten Commit vorsieht. Python hält sich an
den SQL-Standard, auch wenn die Datenbank das (Autocommit) nicht tun
sollte.
Schlaumaier schrieb:> Merke: Leerzeichen sind in JEDER Programmiersprache böse und sollten NIE> im Code bei Variblen , beschreibungen etc eingesetzt werden. Einzige> Ausnahme : Deklarierter Text und dann in " " eingeschlossen.
Merke: SQL ist keine Programmiersprache. Und SQL kennt sich mit
Leerzeichen in Spaltennamen aus, wenn man diese in Hochkommas setzt (so,
wie der TO es getan hat). Klar, empfohlen isses sicherlich nicht
unbedingt, aber sollte in diesem Fall keinen Fehler bringen.
Viel schlimmer könnte es sein, daß er im korrigierten Code nun plötzlich
date und time einzeln als Spaltennamen benutzt, denn das sind eigentlich
Schlüsselwörter (ist aber je nach DB-System wiederrum evtl. auch kein
Problem).
Jens G. schrieb:> Merke: SQL ist keine Programmiersprache. Und SQL kennt sich mit> Leerzeichen in Spaltennamen aus, wenn man diese in Hochkommas setzt (so,> wie der TO es getan hat).
SQL ist eine Datenbanksprache. Das ist jedenfalls nah dran an einer
Programmiersprache.
Und in den von mir kopierten Befehl waren KEINE Hochkommas sonst hätte
ich es nicht angesprochen.
Der TO sollte aber sich von vorne rein angewöhnen DEUTSCHE + EINDEUTIGE
Begriffe für Werte und Variablen_namen zu nutzen. Damit schließt er zu
100 % aus, das er eine Konstante als Variablen_namen nutzt und sich
unnötigen Stress einfängt.
Ich füge im Zweifelsfall immer ein m_ davor. Dann ist das Risiko auch
bei 0.
Kann man für die IoT Pfuscher nicht mal ne eigene Kategorie machen wo
sie ihre Problemchen mit Nodered, Python, ESP, ... und dem anderen
Kidnergartenbastelschrott posten können? Oder besser gleich konsequent
löschen.