2015-02-06 11 views
5

bekam ich folgende Fehlermeldung:Typeerror: ‚int‘ Objekt ist nicht iterable - Python

File "/home/ec2-user/test/test_stats.py", line 43, in get_test_ids_for_id 
    cursor.execute("""select test_id from test_logs where id = %s """, (id)) 
    File "/home/ec2-user/.etl/lib/python2.7/site-packages/MySQLdb/cursors.py", line 187, in execute 
    query = query % tuple([db.literal(item) for item in args]) 
TypeError: 'int' object is not iterable 

Hier ist der Abschnitt meines Codes ist ich mit Mühe mit:

def get_test_ids_for_id(prod_mysql_conn, id): 
    cursor = prod_mysql_conn.cursor() 
    cursor.execute("""select test_id from test_logs where id = %s """, (id)) 
    rows = cursor.fetchall() 
    test_ids = [] 
    for row in rows: 
     test_ids.append(row[0]) 
    return test_ids 
+2

Das sollte 'cursor.execute (... , (id,)) '- notieren Sie das nachgestellte Komma, was es zu einem Tupel macht. – jonrsharpe

+0

@jonrsharpe Können Sie das klar erklären? – brisk

+0

Martijn hat schon! Siehe z.B. http://stackoverflow.com/q/22460082/3001761 – jonrsharpe

Antwort

14

Sie müssen geben cursor.execute ein Tupel, aber sie gab es nur eine ganze Zahl:

(id) 

ein Komma hinzufügen, dass ein Tupel zu machen:

(id,) 

Die durchgezogene Linie then'd sein:

cursor.execute("""select test_id from test_logs where id = %s """, (id,)) 

eine expressione in Klammern Putting nur 'Gruppen', dass ein Ausdruck. Es ist das Komma, dass etwas ein Tupel macht:

>>> (42) 
42 
>>> (42,) 
(42,) 

Jede iterable wirklich tun wird, so dass Sie auch [...] Klammern verwenden:

cursor.execute("""select test_id from test_logs where id = %s """, [id]) 
+0

wow ............ –

+0

Sehr ärgerlich Umgang mit diesem – briankip

+0

@briankip: Warum ist es nervig? Es ist grundlegende Syntax; Programmiersprachen haben immer die gleichen Symbole für verschiedene Bedeutungen in verschiedenen Kontexten verwendet. Kommas werden in Tupeln und beim Trennen verschiedener Parameter in eine Funktionssignatur oder zum Trennen von Basisklassen in einer Klassendefinition oder zum Trennen der Argumente in einem Aufrufausdruck oder der Werte in einer Liste usw. verwendet. Weil Sie manchmal unterscheiden müssen zwischen einem Tupel und den anderen Bedeutungen müssen Sie Klammern um das Tupel verwenden, um es zu disambiguieren. Aber es ist immer noch das Komma, das etwas zu einem Tupel macht. –

Verwandte Themen