2013-03-13 4 views
8

Mam db MSQL i muszę iterować przez tabelę i wykonać akcję po spełnieniu klauzuli WHERE. Kiedy dotrzesz do końca stołu, wróć na górę i zacznij od nowa.Python MySQLdb iteracyjne poprzez tabelę

Obecnie mam

cursor = database.cursor()  
cursor.execute("SELECT user_id FROM round WHERE state == -1 AND state = 2") 
round_id = cursor.fetchone() 

if round != 5 
    ...do stuff 

w pętli, ale to oczywiście tylko utrzymuje zapętlenie pierwszy wpis, myślę, że trzeba użyć w funkcji do odczytu przez stół, ale nie jestem pewien dokładnie jak to zrobić, używając mysqldb ..?

+0

można uzyskać wyniki kwerendy przez wywołanie 'cursor.fetchone()' wielokrotnie (w 'while' na przykład), aż powróci' (None,) ' – dmg

+0

Wierzę, że można po prostu zrobić dla pętli poprzez 'cursor.execute()' – PurityLake

+0

@PurityLake nie, nie możesz. 'cursor.execute' zwraca liczbę wierszy. Możesz zrobić 'dla item_idx w zakresie (cursor.execute()): something = cursor.fetchone()' – dmg

Odpowiedz

7

To ustawi kursor na początku zestawu wyników i powie, ile wierszy wróciło (wróciłem na ten, ale this is the most authoritative documentation Znalazłem, starsze Python MySQLdb lib zwrócił rowcount przy wykonywaniu, ale Python Database API Specyfikacja v2.0 nie powinno to być najbardziej kompatybilny)

cursor.execute("SELECT user_id FROM round WHERE state = -1 OR state = 2") 
numrows = cursor.rowcount 

powie, ile wierszy masz w zamian

for x in xrange(0,numrows): 
    row = cursor.fetchone() 
    print row[0], "-->", row[1] 

Will iteracyjne nad każdym rzędzie (nie ma potrzeby wyliczyć x z zakresem)

+2

warto zauważyć, że zapytanie jest błędne – dmg

+1

Dobra uwaga ... naprawienie ... naprawiono –

+2

i teraz jest to niemożliwe tylko :) – dmg

7

Po uzyskaniu wyników kursora można go w nim powtórzyć.

cursor = database.cursor()  
cursor.execute("SELECT user_id FROM round WHERE state == -1 AND state = 2") 
for round in cursor: 
if round[0] != 5 
    ...do stuff