DB-Abfrage in Schleife gibt immer gleiche Ergebnisse zurück

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
gauron
User
Beiträge: 3
Registriert: Mittwoch 5. November 2008, 17:45

heyho (mein erster Post)

Ich versuche mich grade an einem kleinen Pythonscript, das alle paar Sec eine MySQL Abfrage machen soll und bei Veränderung zur vorherigen Abfrage eine Ausgabe erzeugt :

Code: Alles auswählen

#!/usr/bin/python

# Dieses Script soll auf neue Eintraege in vm_msgs achten 

import MySQLdb 
import time


oldmsg = []
    
con = MySQLdb.connect("localhost", "asterisk" , "helpme", "asterisk")    
sql = 'SELECT MAX(vm_msgs.id), user_id, email FROM vm_msgs, users WHERE users.id = vm_msgs.user_id AND users.email > \'\' GROUP BY users.id'
msg = con.cursor()


while 1:
    
    msg.execute(sql)
    
    for alt in oldmsg:    
	  for neu in msg:
	      if neu[1] == alt[1] and neu[0] == alt[0]:
		    print "Keine Aenderung ..."
	      if neu[1] == alt[1] and neu[0] > alt[0]:
	           print "Eine neue Nachricht !!"
    oldmsg = []
    for neu in msg:
	oldmsg.append(neu)
    msg = []
    time.sleep(2)
Leider ist bei jedem Durchlauf das selbe Ergebniss in 'msg' obwohl sich der Eintrag hätte ändern sollen.
Was ist mein Fehler ????

thx gauron
Zuletzt geändert von gauron am Mittwoch 5. November 2008, 18:03, insgesamt 1-mal geändert.
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Schau dir nochmal deinen Code an. Die Einrückungen sind auf jeden fall hier defekt.
gauron
User
Beiträge: 3
Registriert: Mittwoch 5. November 2008, 17:45

oki danke, war aber n fehler beim übertragen ;) im orginal was i.O.
BlackJack

Wenn MySQL hier eine Datenbank verwendet, die Transaktionen unterstützt siehst Du deswegen vielleicht keine Änderungen.

Oder es passieren tatsächlich keine Änderungen.

Oder Du zeigt uns vielleicht mal *echten* Quelltext wo das Problem auftritt und keinen der beim zweiten Durchlauf meckert, dass Listen keine `execute()`-Methode kennen.

Der Code ist übrigens ein wenig zu kompliziert. Du steckst da mittels einer Schleife *ein einzelnes* Tupel in eine Liste. Eine völlig unnötige Verschachtelung. Gleiches gilt für die verschachtelten ``for``-Schleifen zum Testen. Über eine Liste die grundsätzlich nur ein Element enthalten kann mit einer Schleife zu gehen ist schon unsinnig, dass zu verschachteln ist unsinnig hoch zwei.

Zur Einrückung: Verwende keine Tabs, dann passiert so etwas auch nicht.
gauron
User
Beiträge: 3
Registriert: Mittwoch 5. November 2008, 17:45

ähm das ist eigentlich der echte quelltext , nur grad wirklich nicht funktionsfähig ... war noch ne zwischenversion vom basteln ... das "msg = con.cursor" sollte eigentlich am Anfang der schleife stehen ;)

Das mit den Scheifen muss ich mir echt noch überlegen ... aber bin halt erst Python-Anfänger ;)
Antworten