abwechselnde Lese- und Schreiboperationen in gleiche Datenbank

wowonk

Benutzer
Beiträge
18
Hallo,
ich (Python, mariadb-dummy) habe (Python3, raspberry) folgendes Problem: Ein mir nicht zugänglicher service schreibt alle 15Min Temperaturen in eine Mariadb-Datenbank. Zusätzlich liest mein Python-service alle 15Min die letzten 3 dieser Temperatureinträge aus der Datenbank aus und verarbeitet sie. Weiterhin schreibt mein Prog danach andere Daten mit anderer channel_id in die Datenbank. Ich habe jetzt festgestellt, dass die von mir ausgelesenen Temperaturen teilweise nicht aktuell sind, d.h. es waren nicht die LETZTEN 3.
Meine Fragen:
Ich lese und schreibe in die gleiche Datenbank, kann ich jeweils die gleiche Variable "mysql.connector.connect()" und die gleiche Variable "connection.cursor()" mit unterschiedlicher "query" verwenden?
Wann ist ein <connection.cursor()>.close(), wann ein <connection>.close() erforderlich? Reicht das am Ende des Progs?
Wann ist ein <connection>.commit() erfoderlich? Nur nach der Schreiboperationen?
Mir ist klar, daß mir da noch Verständinis fehlt, eine Antwort und Hinweis auf passenden Doku wäre nett.
Gruss, wowonk
 
Werbung:
Habe ein wenig Erfahrung mit Python sammeln dürfen, du brauchst dazu nur das richtige Python-Modul um mit der MySQl-Datenbank interagieren zu können, dann funktioniert das nach einem Prinzip wie diesem, nur muss halt statt print("Hello World") der Datenbank-Insert executed weren, damit die Werte in die Datenbank eingetragen werden können.

(PYTHON-Code => sogar getestet)
Code:
import time

while True:
    print("Hello World")
    time.sleep(1)

das funktioniert irgendwie (habe Python und Datenbanken mit PgSQL gelöst) mit pg_prepare, 1 Argument bei der Abfrage freilassen und den vom Python-Programm gemessenen wert einfach als Argumment bei pg_execute einsetzen.

Für weitere Fragen, wenn du meinen Weg anpeilst, bitte per PN ;)
hat nämlich nichts mit datenbankn mehr zu tun :D

LG Kampfgummibaerlie
 
Was heißt Teilweise nicht aktuell? Sind es dann die letzten 1-3 Einträge?

Für mich klingt das nach einem Timing Problem. Wenn die 3 Temperaturen (nacheinander) eingetragen werden und zwischen drin wird gelesen, dann ist das klar. Hier bräuchte man ein Locking Mechanismus.
- Schreiben 1, Schreiben 2, Lesen (letzte 3), Schreiben 3 -> Dann wird ein bisher geschriebener und die ersten zwei neuen Einträge gelesen.
 
Hallo,
der andere Service schreibt die Temperatur alle 15 Min. Ich lese alle 15Min die letzten 3 Temperaturen, aber offentsichlich sind es eben manchmal nicht die LETZTEN 3. Mein Prog ist aber nicht mit dem anderen Service in irgendeiner Weise synchronisiert. Wenn die von mir gelesenen Werte nicht korrekt waren, lagen sie auch bez. der Einträge mehr als 15Min daneben. Vielleicht habe ich bez. der oben angegebenen Datenbankoperationen nicht korrekt gearbeitet?
Ich verwende in Python die Module mysql und mysql.connector.
Gruss, wowonk
 
Wenn es um 15 Minuten Intervalle geht, ist es eher ein Programmierfehler als ein Timingproblem oder?
Ich hab noch nicht mit Python und DB gearbeitet, aber ein Cursor öffnet eine Datenmenge, die statisch ist (abgesehen davon, dass ein Cursor dazu gedacht ist, Ergebnisse nachladen zu können, für Paging oder so) und dazu geeignet ist, auf dieser Datenmenge vorwärts oder vorwärts und rückwärts rumzusausen (cursor.previous oder cursor.next)
M.E. braucht man für die wiederholte Abfrage der letzten 3 Werte keinen Cursor sondern feuert immer wieder die gleiche Abfrage, wann man will und so oft man will. "Hole mir die letzten 3 Datensätze".
Je öfter oder schneller man das macht, desto größer ist natürlich die Wahrscheinlichkeit, dass man identische Werte erhält, weil nichts neues dazugekommen ist.
Dein Problem ist aber wohl umgekehrt und ich denke, dass Du fallweise den Cursor nicht richtig schließt (wenn es sporadisch auftritt).

Locking würde hier vermutlich eher zu einer Verschlimmerung führen (Deadlock), wenn Cursor unbeabsichtigt geöffnet bleiben.
Wie gesagt, wie das genau aus Python Perspektive läuft, weiß ich nicht, aber Cursor gehören halt zur DB Seite. Da dürfte es für Pyhton keine Extrawurst geben.
 
Man könnte ja auch bei der Abfrage für die Statisktik / Auswertung ansetzen und statt "den letzten 3 Werten" genauer spezifizieren, welche Werte man haben will. Dann sieht man auch, wenn plötzlich gar keine Werte mehr geliefert werden anstatt das man einfach etwas berechnet, was völliger Blödsinn ist.
 
Sinnvoll wäre es ein Auto increment Feld ( id - primary key) einzubauen. Dieser würde dann automatisch bei jedem neuen schreiben erhöht. Daduch kann der lesende Process sich diese ID merken und zb minütlich die neuen Einträge abarbeiten.

Dadurch kommt es auch nicht zum lesen alter Daten


Code:
SELECT * FROM XXX where id < zuletztVerarbeiteteID LIMIT 3

Gruß

Bernd
 
Wenn man die Daten 1:1 in ein Auswertungssystem übernehmen will wäre so eine ID sehr sinnvoll. Aber auch eine Autoincrement ID löst das Problem nicht wenn am Ende nur ein Mittelwert über die aktuellsten Datensätze gebildet wird, tatsächlich aber gar keine neuen Datensätze mehr geschrieben werden.
 
Wenn man die Daten 1:1 in ein Auswertungssystem übernehmen will wäre so eine ID sehr sinnvoll. Aber auch eine Autoincrement ID löst das Problem nicht wenn am Ende nur ein Mittelwert über die aktuellsten Datensätze gebildet wird, tatsächlich aber gar keine neuen Datensätze mehr geschrieben werden.
Das einbauen einer ID hat gar keinen Einfluss auf die Fehlerbehandlung. Diese muss in jedem Fall gemacht werden. Anhand der ID kann man nur feststellen ob es neue Werte gibt die noch zu verarbeiten sind. ggf. kann man sich auch noch den letzen Zeitstempel holen um festzustellen ob Werte geschrieben werden um so das Verhalten der SW im Fehlerfall besser behandeln zu können.
 
Werbung:
Danke für Eure Hinweise, eine Fehlerbehandlung habe ich. Ich muss wohl nochmal Kenner der Python-Library befragen, evtl. mache ich Fehler in der Verwendung.
Gruss, wowonk
 
Zurück
Oben