Python SQL 数据库字符串字面量与转义
有人知道MySQLdb会不会自动处理SQL语句中的字符串吗?
比如我想执行下面的代码:
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = 'Blah'""")
这样做会自动处理账户名吗?还是说只有在我这样做的时候才会处理?:
x = 'Blah'
cursor.execute("""SELECT * FROM `accounts` WHERE `account_name` = %s""", (x))
或者说它会对两种情况都处理吗?有没有人能解释一下这个问题,因为我找不到相关的信息。
2 个回答
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)
如果这能解答你的问题,请告诉我。
祝你好运。:-)
2
在第一个例子中,没有使用任何转义,这是一个原始的SQL查询。这个查询是有效的,可以正常工作,但显然只有在你总是想要搜索账户名为Blah
的情况下才有意义。
当你需要根据一个变量中的名字来获取账户时,就需要使用参数化的版本。不过你的例子可能不会按预期工作,因为(x)
并不是一个元组,它只是值x
。在元组中,x
应该写成(x,)
。为了避免混淆,你可能更喜欢使用列表[x]
。