任何人都知道MySQLdb是否会自动转义SQL语句的字符串文字?
例如,我正在尝试执行以下操作:
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = 'Blah'""")
这会自动转义帐户名吗?或者只有我做以下事情才能逃脱?:
x = 'Blah'
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = %s""", (x))
或者它会为两者做到吗?任何人都可以澄清这一点,因为我找不到任何相关信息。
答案 0 :(得分:2)
在第一个示例中没有转义,它是原始SQL查询。它是有效的,它会起作用,但显然只有你总是想要搜索帐户Blah
才有意义。
当您需要从变量中的名称获取帐户时,您将需要参数化版本。但是,您的示例可能无法正常工作,因为(x)
不是元组,它只是值x
。元组序列中的x
为(x,)
。为避免混淆,您可能更喜欢使用列表[x]
。
答案 1 :(得分: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)
如果这回答了你的问题,请告诉我。
祝你好运。 : - )强>