• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z while w Pythonie

Object Storage Arubacloud
0 głosów
177 wizyt
pytanie zadane 14 kwietnia 2017 w Python przez niezalogowany

Witam, mam programik, który łączy się z bazą danych, i ma wypisywać po kolei id wszystkich rekordów, ale po każdym go usuwać. Czyli pobiera id pierwszego i go usuwa, itd. Mam kod:

#......
cur = db.cursor();
cura = db.cursor();
cur.execute("SELECT * FROM a")
for row in cur.fetchall():
    a = row[0]
    print a
    cura.execute("DELETE FROM a WHERE id=%s", (a,))
    db.conmit()
   

Wszystko działa, ale chciałem, aby to działało tak  dynamicznie. Czyli wypisuje te co są, ale wciąż czuwa, i na bieżąco jak się doda to wypisze i usunie. Więc dodałem przed tym poprostu while 1==1, oczywiście pamiętając o kolejnych tabulacjach. Ale nie działa. Wypisuje te co jest, a jak się doda to ani nie wypisuje, ani nie usuwa.

Pozdrawiam i z góry dzięki za każde zaangażowanie.

 

 

2 odpowiedzi

0 głosów
odpowiedź 14 kwietnia 2017 przez Wesoły Pan Rekin Początkujący (440 p.)

Chyba tego poszukujesz: 


​​​​​​while True: 
   //kod tutaj 

 

komentarz 14 kwietnia 2017 przez niezalogowany

Zmieniłem, i dorzucam cały kod, ale dalej nie działa:

#-*- coding: utf-8 -*-
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 True:
	cur.execute("SELECT * FROM kolejka")
	for row in cur.fetchall():
		print row[0]
		a = row[0]
		delstatmt = "DELETE FROM `kolejka` WHERE id = %s"
		cura.execute(delstatmt, (a,))
		db.commit()

 

0 głosów
odpowiedź 15 kwietnia 2017 przez lami Nowicjusz (180 p.)

Proponuje dołożyć sleep-a i powinno być OK. No i ten drugi kursor (cura) jest zbędny.

Musisz tylko skorzystać z biblioteki time i funkcji time.sleep()

Nie miałem dostępu do MySql ale zamieszczam minimalnie przerobiony kod z użyciem bazy sqlite.

import sqlite3
import time

conn = sqlite3.connect('cpp.sqlite')
cur = conn.cursor()

cur.executescript('''
CREATE TABLE IF NOT EXISTS kolejka (
    id  INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    name TEXT UNIQUE,
	info TEXT
);
''')

while True:
    cur.execute("SELECT * FROM kolejka")
    for row in cur.fetchall():
        print row[0]
        a = row[0]
        delstatmt = "DELETE FROM `kolejka` WHERE id = ?"
        cur.execute(delstatmt, (a,))	
        conn.commit()
	
    # czekaj 10 sekund
    time.sleep(10)

 

komentarz 15 kwietnia 2017 przez niezalogowany

Pozmieniałem:

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

I masz filmik, gdzie pokazane, że nie działa: LINK

Dodałem wypisanie a aby wiedzieć, czy wogóle się ta pętla wykonuje.

komentarz 19 kwietnia 2017 przez lami Nowicjusz (180 p.)

Przenieś tworzenie kursora do wewnątrz pętli while (cur = db.cursor()).

Dla porządku na samym końcu (poza pętlą while) wypadało by się rozłączyć z bazą:

if db:
    db.close()

Tym razem powinno już działać.

komentarz 19 kwietnia 2017 przez niezalogowany

Podmieniłem:

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

Wyskakuje błąd:

  File "z.py", line 6
    while (cur = db.cursor()):
               ^
SyntaxError: invalid syntax

 

 

komentarz 20 kwietnia 2017 przez lami Nowicjusz (180 p.)

Chodziło mi tylko o przeniesienie tej linii do wnętrza pętli:

import MySQLdb
import time

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

if db:
    db.close()

 

Podobne pytania

+1 głos
1 odpowiedź 450 wizyt
pytanie zadane 15 lutego 2017 w Python przez michalrudy Użytkownik (520 p.)
+1 głos
2 odpowiedzi 692 wizyt
pytanie zadane 11 lutego 2017 w Python przez TheFunny Gaduła (3,420 p.)
0 głosów
1 odpowiedź 193 wizyt
pytanie zadane 5 grudnia 2016 w Python przez Stealch Początkujący (370 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...