Django MySQL在传递参数时查询输出错误

时间:2016-10-27 19:50:56

标签: python mysql django

cur=connection.cursor()

def fillDoctors(key_bodyloc,proportion):
    bodyloc_specialty_query="select distinct Speciality from body_speciality where body_location in (%s) "
    #cur.execute(bodyloc_specialty_query)
    data1=([key_bodyloc])
    #print(bodyloc_specialty_query,data)
    cur.execute(bodyloc_specialty_query,data1)
    results=cur.fetchall()
    specialities=[x[0] for x in results]
    condition=""
    for speciality in specialities:
        print(str(speciality))
        condition=condition+"'%"+speciality+"%'"+" or Speciality like "
    #print(speciality)
    #print(condition)
    specialty_doctors_query="select DoctorName,Speciality,ClinicName from Doctors where Speciality like %s limit %s"
    data2=([condition,proportion])
    print(specialty_doctors_query,data2)
    cur.execute(specialty_doctors_query,data2)

    final=cur.fetchall()
    print(final)

final=cur.fetchall()在每次迭代中返回一个空元组。我已经验证表Doctors不是空的,并且当'条件'被硬编码时代码工作正常。该代码应该打印每个专业的医生详细信息。谁能告诉我为什么会这样?

2 个答案:

答案 0 :(得分:0)

在我打电话给data1时,您似乎没有正确地将bodyloc_specialty_query传递给cur.execute(bodyloc_specialty_query,data1),这会导致问题。

Python中字符串注入的语法如下:

str1 = "some string %s" % "other string"

使用Pythons format内置函数代替这种向字符串添加字符串的方式:

str1 = "some string {str2}".format(str2="other_string").

但请确保您的str2是字符串或可转换为字符串。

我可以看到您的data1list,而不是str。您应该先将其转换为str。祝你好运。

答案 1 :(得分:0)

将参数传递给execute方法的重点是它们被转义。因此,您的条件被视为单个字符串,而不是SQL连接的一系列参数。此外,您不能使用LIMIT值的参数。

您需要通过插值构建一些SQL和占位符,然后只传递值。

like = "speciality LIKE %%%s%%"
condition = like + (" OR {}".format(like)) * len(specialities)
query = "select DoctorName,Speciality,ClinicName from Doctors where {} LIMIT {}".format(condition, proportion)
cursor.execute(query, specialities)

专业专业:     condition = condition +“'%”+ special +“%'”+“或者像”

这样的专业