Nie działa while

0

Witam, mam program, który ma za zadanie się łączyć z bazą danych, pobierać rekord, z tabeli, i go usuwać, a następnie wciąż czuwać, i jeśli się nowy pojawi, to go znowu pobrać i usunąć. Mam kod:

import MySQLdb
db = MySQLdb.connect(user='cpp', passwd='cpp', db='cpp',
                             host='127.0.0.1', port=3306)
                   
cur = db.cursor()
cura = db.cursor()
while 1==1:
	cur.execute("SELECT * FROM kolejka")
	for row in cur.fetchall():
		a = row[0]
		print a
		cura.execute("DELETE FROM kolejka WHERE id=%s", (a,))
		db.commit()

Wszystko działa, tylko, że wypisuje te co są, usuwa je, ale już dalej nie nasłuchuje i jak się jakiś doda, to nic nie robi, ani nie wypisuje ani nie usuwa.

0

Jest kilka możliwości. Jak na moje, to poszukaj sobie funkcji która będzie odświeżać bazę rekordów, albo pobieraj je kilka razy poprzez nadpisanie starej zmiennej.
Podpowiem ci na zasadzie opisu:
#Sprawdzasz czy jest coś do usunięcia, przechowuj w jakiejś zmiennej czy coś było
#Otwierasz nieskończoną pętle. ("while:")
#Otwierasz pętle do usuwania rekordów jeśli jakiś istnieje.
#Wykonujesz wszystkie działania w pętli
#Poza pętlą usuwającą, sprawdzasz rekordy czy coś nowego się pojawiło i przechowujesz w
#Sprawdzasz czy jest coś do usunięcia, przechowuj w jakiejś zmiennej czy coś byłozmiennej jak przed pierwszą pętlą.
#Dodaj jakieś opóźnienie czasowe, bo po co ma sprawdzać istnienie rekordów co kilka setnych bądź tysięcznych sekundy, pół wystarczy.

import MySQLdb
from time import sleep as slp
db = MySQLdb.connect(user='cpp', passwd='cpp', db='cpp',
                             host='127.0.0.1', port=3306)

cur = db.cursor()
cura = db.cursor()
while True:
    cur.execute("SELECT * FROM kolejka")
	for row in cur.fetchall():
			a = row[0]
			print(a)
			cura.execute("DELETE FROM kolejka WHERE id=%s", (a,))
			db.commit()
    cur = db.cursor()
    cura = db.cursor()
    slp(0.5)

Sprawdź sobie w sumie czy coś takiego zadziała, tylko sobie przełóż na python2, bo tak z nawyku już napisałem :s.

0

Dalej nic. Wciąż nie działa. Ten sam problem. A może, umiesz zrobić tak, że jak ktoś dodaje do tabeli rekord, przez PHP, to wtedy jest tak powiem wywoływany, ten skrypt, a nie while True. Albo słyszałem o nasłuchiwaniu socketu. Ale niewiem jak to zrobić. Bo jeśli to być mi pokazał jak zrobić, to wtedy while nie będzie potrzebne.

0

Hmmm... Błąd jest raczej na poziomie podstaw programowania w pythonie którego nie możemy dojrzeć. Pakietu nie mam zainstalowanego na tymczasowym sprzęcie więc niestety nie jestem ci w stanie podać prawidłowego rozwiązania. Ale spróbuję ci pomóc go rozwiązać. Tak więc pobawimy się w lekcje testowania. Napisz mi co wyrzucą printy.
Na razie porzućmy pętle, wrzuć rekord pomiędzy jednym, drugim a trzecim sprawdzeniem, sleep da ci 10 sekund czasu, jakbyś potrzebował więcej/mniej to sobie zmień :).

Na dwójce nieoperowałem więc niestety musisz sobie dostosować jeśli coś ujmę w sposób który wywoła SyntaxError:

import MySQLdb
from time import sleep as slp
db = MySQLdb.connect(user='cpp', passwd='cpp', db='cpp',
                             host='127.0.0.1', port=3306)
 
cur = db.cursor()
cura = db.cursor()
cur.execute("SELECT * FROM kolejka")
#Sprawdzamy po pierwszym zczytaniu
print(cur, cura)
type(cur, cura)
for row in cur.fetchall():
    a = row[0]
    cura.execute("DELETE FROM kolejka WHERE id=%s", (a,))
    db.commit()
print(cur, cura)
type(cur, cura)
#Tu sprawdzamy po usunieciu
cur = db.cursor()
cura = db.cursor()

#Próbujemy zczytac po próbie kolejnego odczytu czy cos sie zmienilo od usuniecia
print(cur, cura)
type(cur, cura)
#Zerknijmy jeszcze co się stało ze zmienną cur po funkcji execute.
cur.execute("SELECT * FROM kolejka")
print(cur, cura)
type(cur, cura)

slp(10)
#A w tych 10 sekundach sprobuj dograc jakis rekord :).
cur = db.cursor()
cura = db.cursor()
#A teraz przetestujemy po zczytaniu co nam wypluje.
print(cur, cura)
type(cur, cura)

Typ nie bez powodu, bo wywołanie funkcji może zwrócić None, print nie wiem czy nie wyrzuci nam że jest to obiekt klasy, ale może się uda ;p

1 użytkowników online, w tym zalogowanych: 0, gości: 1