Mysql sich ändernde Daten auslesen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Und in dem Code, den Du zeigst, ist auch kein Fehler, weil das wichtige davon fehlt.
Wenn Du also WIRKLICHE Hilfe willst, ...
Nonickatall
User
Beiträge: 19
Registriert: Dienstag 31. Januar 2017, 21:33

Sirius3 hat geschrieben: Samstag 17. April 2021, 17:50 ›while 1‹ sollte ein ›while True‹ sein. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 1 oder 2 oder 4 Leerzeichen.
1 ist genauso True wie True und wie viele Leerzeichen ist doch wurscht, Hauptsache sie sind gleich eingerückt... Das tut der Funktion des Codes doch keine Abbruch. :wink:
Sirius3 hat geschrieben: Samstag 17. April 2021, 17:50 Variablennamen und Funktionen schreibt man komplett klein.
Ok, mag sein, aber auch das führt nicht zu diesem "Fehler"..
Sirius3 hat geschrieben: Samstag 17. April 2021, 17:50 Du holst SMS machst aber gar nichts damit? Was soll die 1?
Ich hole die SMS und schreibe sie zur weiteren Verwendung in die MySQL Datenbank. Das macht die Funktion SMS_holen() Das funktioniert fehlerfrei. Die 1 ist ein Parameter, der ist historisch und eigentlich nicht mehr nötig.
Sirius3 hat geschrieben: Samstag 17. April 2021, 17:50 Was soll die 1 bei db1cursor und warum holst Du Dir den Cursor von einer con(sole)?
Der Code dafür ist:

Code: Alles auswählen

con = mysql.connector.connect(host = "192.168.0.1"... usw..
Ich habe an anderer Stelle auch Cursor und die hießen immer dbcursor. Für Testzwecke habe ich den dann einfach mal db1cursor genannt, nur damit er einen eigenen Namen hat.
Sirius3 hat geschrieben: Samstag 17. April 2021, 17:50 Warum holst Du Dir nur einen Eintrag aus der Tabelle (und das so umständlich), benutzt dann aber eine for-Schleife? Das ist verwirrend.
Ja, stimmt, das war historisch und ich hatte es noch nicht entfernt.
Sirius3 hat geschrieben: Samstag 17. April 2021, 17:50 Benutze keine *-Select sondern gib Spaltennamen an, so kann es keinen Fehler mit Indizes geben.
Das Schließen des Cursors innerhalb der for-Schleife ist definitiv falsch.
Ok
Sirius3 hat geschrieben: Samstag 17. April 2021, 17:50 Wenn Du nur die SMS-ID brauchst, warum holst Du dann noch so viel mehr Informationen. Und was fängt eine SMS-Senden-Funktion nur mit der ID an?
Ich hatte die Informationen während des Testens da mal rein geschrieben, um zu schauen, wo, was ankommt. Aber eigentlich gebe ich an die Funktion nur die id weiter, über die die Funktion sich selbst alle Daten aus der SQL Tabelle holt. Ich könnte die natürlich auch als globale Variablem weitergeben, zumal es ja einfach nur Nummer und Text ist.
Sirius3 hat geschrieben: Samstag 17. April 2021, 17:50 Wenn Du Python2 benutzt, dann sind die Klammern bei print Unsinn.
Das ganze sieht also so aus:

Und von Löschen eines Datensatzes sehe ich hier nichts.
In dem Teil des Codes, den Du hier zeigst, ist kein Fehler.
Ich habe versucht auf die Schnelle mal auf Python 3 umzustellen, aber das geht nicht. Ich verwende Gammu und da ist die Python 3 Bibliothek nicht kompatibel. Deswegen funktioniert dein Code auch nicht, denn in Python 2 gibt es kein contextlib und Gammu funktioniert, zumindest nicht spontan auf Python 3.

Da da aber eine komplette Haussteuerung läuft, will ich da jetzt nix spontan uminstallieren und dann die nächsten Tage damit verbringen, alles wieder ans Laufen zu bringen. :wink:

Ich setze jetzt erst mal einen weiteren Rechner auf und werde das dann mal mit deinem Code und Python 3 versuchen. Vielleicht komme ich dann weiter..

Vielen Dank erstmal bis hierhin..

Ich melde mich die Tage, wenn ich soweit bin oder ich es ans Laufen bekommen habe wieder.

Bis dahin an alle liebe Grüße und bleibt gesund.

Ralf
Nonickatall
User
Beiträge: 19
Registriert: Dienstag 31. Januar 2017, 21:33

So, nachdem mich das nicht los gelassen hat, hier die Lösung:

Der Aufruf der Datenbank selbst muss in der Schleife stehen, dann geht es...
Trotzdem danke an alle...

Code: Alles auswählen

# -*- coding: utf8' -*-
import time
import mysql.connector

Startzeit = time.strftime("%d.%m.%Y %H:%M:%S")

print ("Start des SMS Tools am :" + time.strftime("%d.%m.%Y %H:%M:%S"))

#Loop
while True:

#SMS senden
    con = mysql.connector.connect(host = "192.168.0.1",
        user = "user",
        passwd = "irgendeinpasswort",
        db = "meine Datenbank")
    
    dbcursor = con.cursor()
    dbcursor.execute("select id, status, nummer, text, datum from sms_send order by id asc limit 1")
    try:
        sms_id, status, nummer, text, datum =dbcursor.fetchone()
        print (sms_id)
        print (nummer)
        print (text)
        
    except:
        print ("kein Datensatz")

    time.sleep(2)
   
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Seufz. Oder ein commit. Wie ich ja gezeigt habe. Denn die Transaktion isoliert dich von Änderungen. Siehe https://dev.mysql.com/doc/refman/8.0/en ... evels.html

Alternativ das isolation level ändern.
Nonickatall
User
Beiträge: 19
Registriert: Dienstag 31. Januar 2017, 21:33

__deets__ hat geschrieben: Samstag 17. April 2021, 22:48 Seufz. Oder ein commit. Wie ich ja gezeigt habe. Denn die Transaktion isoliert dich von Änderungen. Siehe https://dev.mysql.com/doc/refman/8.0/en ... evels.html

Alternativ das isolation level ändern.
Ich verstehe nicht, was du mir sagen willst. Ein Commit beschränkt sich doch auf das Schreiben in einer Datenbank, nicht aber auf das Lesen. Außerdem habe ich weiter oben doch beschrieben, dass ich das dennoch versucht habe. Ohne Erfolg..

Und was mir ein "isolation level" bringen soll, erschließt sich mir nicht. Ich habe keine Massendaten und verschiedenste Clients, die auf die gleichen Daten schreibend zugreifen und ich muss nicht für Daten Konsistenz sorgen..

Ich wollt einfach nur einen neu dazu gekommen Datensatz sehn.. :roll:
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du den Link mal durchgelesen? Da steht die Antwort auf deine Fragen: die Datenbank legt einen Snapshot an, durch den du die Aenderung der Daten erst dann zu sehen bekommst, wenn du die Transaktion explizit abschliesst. Mit Commit oder Rollback. Das ist so gewollt.

Man kann es natuerlich auch erreichen, indem man immer wieder die Verbindung abreisst, und neu aufbaut, was auch eine neue Transaktion erzeugt. So hast du das "geloest".

Und "beschrieben" hast du irgendwas irgendwie mit commit. Mein Code belegt, das es geht. Irgendwer hat also irgendwo einen Fehler gemacht, in Code, den er nicht gezeigt hat. Aber das ist natuerlich alles irrelevant :roll:

Im uebrigen zwingt dich niemand, eine Technologie einzusetzen, die Millionen Datensaetze und hunderte konkurrierende Zugriffe zeitgleich abarbeiten kann. Aber wenn du es tust, dann wirst du dich wohl oder uebel damit auseinander setzen muessen, wie diese Technologie tickt. Wer statt einem Spaten einen Bagger bemueht, wird auch was ueber Kettenschmiermittel lernen muessen.

Wesentlich besser waere natuerlich eine Technologie, die speziell fuer das hier beschriebene Szenario gemacht ist, zu nutzen. Also zB eine persistente Queue. Aber das ist natuerlich wieder so ein Fall von "sollte man machen", auf den du ja eher allergisch reagierst.
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

@Nonickatall: Und das Problem mit dem "mein Code ist irgendwie so, aber zeigen will ich ihn nicht" ist, als würdest du mit einem fremden Kind zum Arzt gehen, weil dein Sohn Kopfschmerzen hat. Ist auch ein Kind. Hat auch einen Kopf. Also warum kann der Arzt an dem nicht deinen Sohn diagnostizieren?
Antworten