"Event" in SQL

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Guten Tag zusammen,
ich versuche gerade einen "Event Listener" zu schreiben, der auf einen Wert in einer SQL Tabelle wartet.
Im Grunde ist die Logik sehr einfach dafür:
- Jede Sekunde wird mit einem einfachen "select" nach einem angegebenen Wert gesucht
- Nach 10 Sekunden gibt es einen Timeout.

Das war es schon. Mein Code bis jetzt:

Code: Alles auswählen

def aufAntwortwarten(auftrag_id):
    gefunden = False
    for	i in range(0, 10):
     	print "Versuch %d  von 10" % i + 1
     	suche = connection.execute(telestack.select().where(telestack.c.auftrag_id==auftrag_id)).fetchone()
     	if suche:
            gefunden = True
            break
     	time.sleep(1)
    if gefunden:
     	return suche
    else:
     	return False
Allerdings bekomme ich nichts vom select zurück wenn innerhalb des Loops in die Tabelle geschrieben wurde.
Wieso ist dies so und wie kann man dies lösen?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@audacity363: welche Datenbank und welche Anbindung benutzt Du denn? Commitest Du auch das, was Du in die Datenbank schreibst?
Statt False ist es üblich bei keiner Antwort None zurückzuliefern oder gleich eine Exception zu werfen. Dein Code ist fehlerhaft: Strings und Zahlen kann man nicht addieren. Woher kommt connection? Klassen sollten mit einem Großbuchstaben Anfangen.

Code: Alles auswählen

def aufAntwortwarten(connection, auftrag_id):
    for i in range(1, 11):
        print "Versuch %d  von 10" % i
        suche = connection.execute(Telestack.select().where(Telestack.c.auftrag_id==auftrag_id)).fetchone()
        if suche:
            return suche
        time.sleep(1)
    return None
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Sirius3 hat geschrieben:@audacity363: welche Datenbank und welche Anbindung benutzt Du denn? Commitest Du auch das, was Du in die Datenbank schreibst?
Statt False ist es üblich bei keiner Antwort None zurückzuliefern oder gleich eine Exception zu werfen. Dein Code ist fehlerhaft: Strings und Zahlen kann man nicht addieren. Woher kommt connection? Klassen sollten mit einem Großbuchstaben Anfangen.
Ich benutze MySql mit SqlAlchemy als Python Schnittstelle. Ja ich commite es. Es steht ja in der Tabelle drinnen. Wenn ich das ganze noch einmal laufen lasse findet er den Eintrag sofort.
Warum ist der Code fehlerhaft? "i" ist doch ein Integer den ich mit "%d" in den String einbinde.
"connection" ist eine globale Variable in diesen Programm.
Das ganze ist ein kleiner Ausschnitt aus einem Programm, welches als Datenbank Schnittelle fungiert.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@audacity363: ob das Programm mit einem Fehler abbricht oder nicht, läßt sich einfach dadurch zeigen, indem man es startet. Ob etwas in einer Tabelle zu einem bestimmten Zeitpunkt drinnen steht, kannst Du nicht dadurch zeigen, dass es irgendwann später drinsteht.
Dass connection global ist, ist mir schon klar, das ist aber schlecht.
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

Sirius3 hat geschrieben:@audacity363: ob das Programm mit einem Fehler abbricht oder nicht, läßt sich einfach dadurch zeigen, indem man es startet. Ob etwas in einer Tabelle zu einem bestimmten Zeitpunkt drinnen steht, kannst Du nicht dadurch zeigen, dass es irgendwann später drinsteht.
Das Programm läuft ja, sonst würde ich dies ja auch erwähnen bzw. gar nicht hier posten.
In den 10 Sekunden kann man sich aber per SQL Konsole die Tabelle ausgeben lassen und sehen, dass der Eintrag, der eigentlich von dem Python Programm gefunden werden sollte, in der Tabelle steht. Damit sehe ich das er nicht richtig die Query absetzt bzw. aus irgendeinem Grund keine Ergebnisse zurück gibt.
Antworten