2010-11-15 75 views
2

任何人都知道MySQLdb是否會自動轉義SQL語句的字符串文字?Python SQL數據庫字符串文字和轉義

比如我想執行以下操作:

cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = 'Blah'""") 

這是否會自動跳脫的帳戶名?或者如果我做以下事情,它只會逃脫嗎?:

x = 'Blah' 
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = %s""", (x)) 

或者它會這樣做嗎?任何人都可以澄清這一點,因爲我無法找到任何信息。

+0

對符號'(x)'沒有意義。 – Danosaure 2010-11-15 23:34:59

回答

2

第一個示例中沒有轉義,它是原始SQL查詢。這是有效的,它會起作用,但顯然它只有在你想要搜索賬戶Blah時纔有意義。

當您需要從變量名稱中獲取賬戶時,您需要參數化版本。但是,您的示例可能無法正常工作,因爲(x)不是元組,它只是值x。元組序列中的x將爲(x,)。爲避免混淆,您可能更願意使用列表[x]

1

轉義只有在您將查詢和數據分別提交給MySQLdb時纔會執行。這就是它知道如何逃避。 :-)

因此,只有你的第二個示例將難逃:

x = ('Blah',) 
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = %s""", x) 

注意我是如何改變x對元組。這就是MySQLdb所期望的。這很有意義,因爲您可能需要傳遞多個變量。喜歡:

x = ('Blah','Foo23') 
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = %s OR `account_code` = %s""", x) 

讓我知道這是否回答你的問題。

祝你好運。 :-)