2010-08-11 51 views
3

嘿,我得到一個錯誤Python和MySQLdb的錯誤:OperationalError:(1054, 「在 'where子句' 未知列」)

OperationalError: (1054, "Unknown column 'XX' in 'where clause'")

其中xx是在下面的代碼類的Value

conn = MySQLdb.connect(host = "localhost",user = "user", passwd = "pass",db = "dbase") 
cursor = conn.cursor() 
cursor.execute("""SELECT * FROM %s WHERE course =%s AND sec = %s""" % (str(DEPT),str(CLASS),str(SEC),)) 

事情是,我只得到這個錯誤的某些值,即當CLASS包含一個字母。我把表設置爲varchar如果有幫助

謝謝!

回答

4

不要在你的SQL中使用「字符串注入」,除非它真的不可缺少,比如str(DEPT)這裏選擇你選擇的表。對於其他情況,請使用Python DB API的參數傳遞功能 - 它會爲您正確引用一些內容,並自動防禦「SQL注入」攻擊等等。 (有時也可以更快)。

由於MySQLdb的使用爲參數不幸符號%s,這裏是你應該做的(也固定的風格是PEP8兼容,不必需的,但不能傷害;-):

conn = MySQLdb.connect(host="localhost", user="user", passwd="pass", db="dbase") 
cursor = conn.cursor() 
q = 'SELECT * FROM %s WHERE course=%%s AND sec = %%s""" % (DEPT,) 
cursor.execute(q, (CLASS, SEC)) 

%% s中產生的q在格式化時會變成單個%,所以q剩下兩個出現%s-- executeCLASSSEC正確格式化的版本整齊地填充。所有str電話是多餘的,等

順便說一句,如果你對Python的2.6或更高版本,用於字符串格式化你應該使用新的format方法,而不是老%運營商 - 您節省從除了其他優勢之外,還需要那些「加倍%符號」。我還沒有在上面的代碼片段中應用這個改變,以防萬一你停留在2.5或更早的版本(所以上面的代碼可以在任何版本的Python中工作,而不是僅僅在最近的代碼中)。

+0

很抱歉,但我真的很新的SQL和Python。你能解釋一下,如果這個參數不是太大,你可以解釋一下傳遞的參數嗎 謝謝! – 2010-08-11 21:05:14

+0

謝謝亞歷克斯!欣賞它 – 2010-08-11 21:07:50

+0

@Jill,當然,請參閱我剛纔對我的回答所做的修改 - 我簡單地重寫了代碼以使其正確(並且符合PEP8標準,以確定空間何處去或哪裏不適合優雅的風格,並且更快捷並通過避免一堆冗餘的「str」調用來讀取,但這些只是側面的問題;-)。 – 2010-08-11 21:08:02

1

相反的:

course=%s 

我想你需要:

course='%s' 
+1

亞歷克斯的答案是更好的方法。 – Shane 2010-08-11 21:05:42

+0

不,我得到一個關於正確語法的錯誤:/ – 2010-08-11 21:06:23

相關問題