2016-02-09 70 views
0

我有下面的代码,在那里我试图遍历一个元组:无法遍历元组列表MySQLdb的

cust_list = ('138') 

for cust in cust_list: 
    dbQuery = """ 
     SELECT DISTINCT 
      c.id, 
      c.name, 
      c.email 
     FROM 
      customers c 
     WHERE 
      c.id = %s; 
    """ 
    cur1.execute(dbQuery, cust) 

    row = cur1.fetchone() 
    cust_name = row[1] 
    cust_email = row[2] 

下表客户包含一条记录如下

id: 138 
Name: Xoom Support 
Email: [email protected] 

我会期望for循环为元组中的单个值运行一次,但相反,我得到以下错误:

Traceback (most recent call last): 

     File "/usr/local/bin/stats-test.py", line 80, in <module> 
     cust_name = row[1] 
    TypeError: 'NoneType' object has no attribute '__getitem__' 

I试图打印出产生以下结果的行:

(1L, 'Xoom Support', '[email protected]') 
    ^^^ 
    | 
What is this?? 

我对于发生了什么感到十分困惑。

+0

错误是否发生在循环的第一次执行中?我的意思是,你打印的那一行是否会产生错误? '1L'和Long类型一起表示数字1。 – Javitronxo

+0

@Javitronxo我认为这是1L的意思,不知道为什么我得到那个。这个问题似乎与单值元组有关,如果我将元组设置为('138','123'),则循环似乎工作正常: -/ – btongeorge

回答

2

好的,您与1L的混淆使我发现错误。用一个数字迭代一个元组和有两个数字的元组是有区别的,这种差别在于没有逗号。实际上,cust_list = ('138')的类型是String。

在第一种情况下,您将遍历数字的每个数字,而在第二种情况下,您将迭代每个数字。看看下面的执行:

>>> cust_list = ('138') 
>>> for cust in cust_list: 
... print cust 
... 
1 
3 
8 
>>> cust_list = ('138','123') 
>>> for cust in cust_list: 
... print cust 
... 
138 
123 

要编写包含您必须包括一个逗号,即使只有一个值的单值的元组...

重新定义你的元组,以获得所期望的执行:

>>> cust_list = ('138',) 
>>> for cust in cust_list: 
... print cust 
... 
138 
+0

了解并感谢完整的解释。今天学了一些有关元组的知识! – btongeorge

+0

不客气,很高兴帮助! – Javitronxo