Nie działa while

Nie działa while
HA
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 3 lata
  • Postów:2
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:

Kopiuj
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.

edytowany 1x, ostatnio: flowCRANE
Guaz
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Częstochowa
  • Postów:221
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.

Kopiuj
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.


Linux Mint
Arduino / Python 3.5.2
edytowany 2x, ostatnio: Guaz
HA
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 3 lata
  • Postów:2
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.

Guaz
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Częstochowa
  • Postów:221
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:

Kopiuj
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


Linux Mint
Arduino / Python 3.5.2

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.