Python SQL 数据库字符串字面量与转义

2 投票
2 回答
2980 浏览
提问于 2025-04-16 07:07

有人知道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]

撰写回答