我正在尝试编写调用mysql 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 :(得分:3)
您的查询使用dict游标,因此它将返回一个dicts列表,例如:
[{'id': 1}, {'id': '2'}, ...]
这意味着你的id
*将是一个字典,而不是一个元组。这意味着您将参数作为dict传递给第二个查询。如果这样做,则需要使用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
也是dict
s。
此外,查询参数应作为dict(命名参数)或元组(位置参数)传递。 pymysql
接受cursor.execute(sql, "name")
格式,其他dbapi2连接器不接受。规范形式为cursor.execute(sql, ("name",))
。
*顺便说一下,您不应该使用id
作为名称,它会隐藏内置id
功能