2016-10-27 34 views
0
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不是空的,並且當'條件'是硬編碼時,代碼工作正常。該代碼應該打印每個專業的醫生詳細信息。誰能告訴我爲什麼會發生這種情況?Django傳遞參數時MySQL查詢輸出錯誤

回答

0

對我來說,你打電話給cur.execute(bodyloc_specialty_query,data1)時,並沒有正確地將你的data1轉換成bodyloc_specialty_query,並導致了問題。

在Python字符串注射的語法如下:

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

而不是添加一個字符串,字符串的這種方式,使用蟒蛇format內置函數:

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

但要確保您的str2是一個字符串或可轉換爲字符串。

我可以看到你的data1list而不是str。您應該先將其轉換爲str。祝你好運。

+0

有字面上'%'和'format'當它沒有區別來自SQL注入的安全性:兩者都沒有提供。 –

+0

好的。編輯。我認爲我需要對此進行研究 –

+0

line results = cur.fetchall()可以正常工作並返回預期結果。問題在於'specialty_doctors_query'是我所知道的,但我無法理解。 –

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) 

在專業特長: 條件=條件+ 「 '% 」+特長+「 %'」 + 「或專業像」