2017-06-02 46 views
0

我正在嘗試編寫調用mysql SQL的python腳本。在腳本中執行SQL的Python腳本

我依靠第一個查詢結果來運行第二個查詢。問題是它拋出錯誤。

錯誤:cursor2.execute(field_sql,ID)

import boto3 
import importlib 
import psutil 
import pymysql 
import pymysql.cursors 
import subprocess 
import sys 

rdsConn = pymysql.connect(host = 'XXXX'), 
          db = 'XXXX', 
          user = 'XXXX', 
          password = 'XXXX', 
          charset = 'utf8mb4', 
          cursorclass=pymysql.cursors.DictCursor) 

cursor1 = rdsConn.cursor() 
cursor2 = rdsConn.cursor() 


name = 'Test' 
sql = "select id from Table1 where name = %s" 
cursor1.execute(sql,name) 
result = cursor1.fetchall() 
for id in result: 
    field_sql= "select columnname from Table2 where id = %s" 
    cursor2.execute(field_sql,id) 
    fieldresult = cursor2.fetchall() 
    for fieldrow in fieldresult: 
     print(fieldrow) 

cursor1.close() 
cursor2.close() 
rdsConn.close() 
+0

什麼錯誤到底是什麼?請發佈堆棧跟蹤。 – mata

+0

您是否嘗試過查看從第一個查詢中獲得的結果?它返回一個字典,所以你的for循環將遍歷鍵,但也許你想要的值? –

回答

2

查詢使用的字典光標,所以它會返回類型的字典列表,例如:

[{'id': 1}, {'id': '2'}, ...] 

這意味着你的id *將是一個字典,而不是一個元組,因爲否則。這意味着你將你的論點作爲字典傳遞給第二個查詢。如果你這樣做,你需要使用pyformat風格來使用命名參數:

for rowdict in result: 
    field_sql = "select columnname from Table2 where id = %(id)s" 
    cursor2.execute(field_sql, rowdict) 
    fieldresult = cursor2.fetchall() 
    for fieldrow in fieldresult: 
     print(fieldrow) 

你會看到,印刷fieldrow s爲也dict秒。

此外,查詢參數應以dict(命名參數)或元組(位置參數)的形式傳遞。 pymysql接受表格cursor.execute(sql, "name"),其他dbapi2連接器不接受。規範形式將是cursor.execute(sql, ("name",))

*順便說一句,你不應該使用id名稱,它隱藏了內置id功能