用于循环执行SQL的Python脚本

时间:2017-06-02 07:25:19

标签: python pymysql

我正在尝试编写调用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()

1 个答案:

答案 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功能