2015-02-06 15 views
5

ho ottenuto il seguente errore:TypeError: 'int' oggetto non è iterabile - 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 

Ecco la sezione del mio codice che sto avendo problemi con:

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

Questo dovrebbe essere 'cursor.execute (... , (id,)) '- nota la virgola finale, che la rende una tupla. – jonrsharpe

+0

@jonrsharpe Puoi spiegare chiaramente? – brisk

+0

Martijn ha già! Vedi per es. http://stackoverflow.com/q/22460082/3001761 – jonrsharpe

risposta

14

È necessario dare cursor.execute una tupla, ma hai dato solo un numero intero:

(id) 

aggiungere una virgola per far sì che una tupla:

(id,) 

La linea completa then'd essere:

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

Mettere un expressione tra parentesi solo 'gruppi' che un'espressione. E 'il virgola che fa qualcosa di una tupla:

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

Qualsiasi iterabile farà davvero, così si potrebbe anche usare [...] parentesi:

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

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

+0

Molto fastidioso trattare con questo – briankip

+0

@briankip: perché è fastidioso? È sintassi di base; i linguaggi di programmazione hanno sempre utilizzato gli stessi simboli per significati diversi in contesti diversi. Le virgole vengono utilizzate nelle tuple e quando si separano parametri diversi in una firma di funzione o per separare le classi base in una definizione di classe o per separare gli argomenti in un'espressione di chiamata, i valori in un elenco, ecc. Perché a volte è necessario distinguere tra una tupla e gli altri significati, è necessario utilizzare parentesi attorno alla tupla per disambiguarla. Ma è ancora la virgola che fa qualcosa di una tupla. –

Problemi correlati