2010-11-15 78 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) 

让我知道这是否回答你的问题。

祝你好运。 :-)