2016-02-09 102 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