2015-02-06 21 views
5

Tôi đã nhận lỗi sau:Lỗi Loại: 'int' đối tượng không phải là 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 

Dưới đây là phần mã của tôi, tôi đang gặp rắc rối với:

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

Điều đó sẽ được 'cursor.execute (... , (id,)) '- lưu ý dấu phẩy, làm cho nó trở thành một bộ dữ liệu. – jonrsharpe

+0

@jonrsharpe Bạn có thể giải thích rõ ràng không? – brisk

+0

Martijn đã có! Xem ví dụ http://stackoverflow.com/q/22460082/3001761 – jonrsharpe

Trả lời

14

Bạn cần phải cho cursor.execute một tuple, nhưng bạn chỉ cho nó một số nguyên:

(id) 

Thêm một dấu phẩy để làm điều đó một tuple:

(id,) 

Dòng đầy đủ then'd là:

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

Đưa một expressione trong ngoặc đơn chỉ 'nhóm' rằng một biểu thức. Đây là dấu phẩy mà làm một cái gì đó một tuple:

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

Bất kỳ iterable sẽ làm thực sự, vì vậy bạn cũng có thể sử dụng dấu ngoặc [...]:

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

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

+0

Rất khó chịu đối phó với điều này – briankip

+0

@ briankip: tại sao nó gây phiền nhiễu? Đó là cú pháp cơ bản; ngôn ngữ lập trình luôn luôn sử dụng cùng một biểu tượng cho ý nghĩa khác nhau trong các ngữ cảnh khác nhau. Các dấu phẩy được sử dụng trong các bộ dữ liệu và khi phân tách các tham số khác nhau thành chữ ký hàm hoặc tách các lớp cơ sở trong định nghĩa lớp hoặc để tách các đối số trong biểu thức cuộc gọi hoặc các giá trị trong danh sách, v.v. giữa một bộ tuple và các nghĩa khác, bạn cần sử dụng dấu ngoặc đơn quanh tuple để phân biệt nó. Nhưng nó vẫn là dấu phẩy mà làm cho một cái gì đó một tuple. –

Các vấn đề liên quan