2015-12-11 49 views
2

我想循環MySQL查詢,但我無法讓變量工作。我究竟做錯了什麼?循環在行開始10如何將變量傳遞到Python的MySQLdb查詢?

cur = db.cursor() 
query = ''' 
Select user_id, solution_id 
From user_concepts 
Where user_id IN 
    (Select user_id FROM fields); 
'''  
cur.execute(query) 
numrows = cur.rowcount 
for i in xrange(0,numrows): 
    row = cur.fetchone() 
# find all item_oid where task_id = solution_id for first gallery and  sort by influence. 
    cur.execute(''' 
     SELECT task_id, item_oid, influence 
     FROM solution_oids 
     WHERE task_id = row[%d] 
     ORDER BY influence DESC; 
     ''', (i)) 
    cur.fetchall() 

錯誤消息:

File "james_test.py", line 114, in ''', (i)) File "/usr/lib64/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

回答

1

下面是我將如何做到這一點。你可能不需要聲明2個遊標,但它不會傷害任何東西。有時需要第二個遊標,因爲可能會有衝突。注意我如何演示2種不同的循環遊標數據的方法。一個帶有fetchall,另一個通過循環遊標。第三種方法可以使用提取,但未顯示。使用字典光標非常好,但有時您可能需要使用標準的非字典遊標,其中值只能通過行數組中的數字檢索。另請注意,只有1個參數時,需要在參數列表中使用尾隨逗號。因爲它期望一個元組。如果您有多個參數,則不需要尾隨逗號,因爲多於一個參數將是一個元組。

cursor1 = db.cursor(MySQLdb.cursors.DictCursor) # a dictcursor enables a named hash 
cursor2 = db.cursor(MySQLdb.cursors.DictCursor) # a dictcursor enables a named hash 

cursor1.execute(""" 
    Select user_id, solution_id 
     From user_concepts 
    Where user_id IN (Select user_id FROM fields); 
"""  

for row in cursor1.fetchall(): 
    user_id = row["user_id"] 
    solution_id = row["solution_id"] 

    cursor2.execute(""" 
     SELECT task_id, item_oid, influence 
     FROM solution_oids 
     WHERE task_id = %s 
     ORDER BY influence DESC; 
    """, (solution_id,)) 

    for data in cursor2: 
     task_id = data["task_id"] 
     item_oid = data["item_oid"] 
     influence = data["influence"] 
+0

這幫助我比我的問題更多。非常感謝。 –

2

cur.execute期待PARAMS一個tupleØdict但你給(i)這是一個int不是tuple。爲了使一個tuple添加逗號(i,)

+0

非常好的提示!我有一個類似的問題,在一個不同的上下文.. – rocksteady