【发布时间】:2015-10-11 23:17:40
【问题描述】:
背景:关于 MySQLdb 连接器的文档不多
也许我找错地方了,但是关于 Python 的 MySQLdb 连接器系列的文档并不多。也许PEP249 是为了完成这项工作。 Oracle 的 MySQL/Python 连接器似乎有更好的docs,但目前我正在使用mysqlclient(MySQLdb 的 3.x 版本,它环绕 C 连接器)。
MySQLdb 中的命名参数:适用于单个值
经过大量搜索,我偶然发现了用于绑定命名参数的漂亮语法,只要它们是单个值。例如(为简化案例而编造的查询):
query = """
SELECT...
WHERE
name = %(name)s AND
gender = %(gender)s
"""
parameters = {'name': name, 'gender': gender}
cursor.execute(query, parameters)
这正确地转义了参数。太棒了。
MySQLdb中的命名参数:如何使用iterables?
现在我想使用集合、列表或元组来构建带有IN 的查询。比如:
query = """
SELECT...
WHERE
gender = %(gender)s AND
name IN %(nameset)s
"""
我发现了一个类似的问题here,但该查询不使用命名参数(占位符已命名,但不是可迭代的)。
我错过了什么?有人知道实现这项工作的神奇语法吗?
我在 MySQLdb 代码中看到 paramstyle 设置为 format 而不是 pyformat,但 pyformat 确实适用于单个值。
为了澄清,
- 我对只构建像
('sophie', 'jane', 'chloe')这样的字符串并将其连接到查询的答案不感兴趣。我需要绑定参数来保证正确的转义。 - 我也对连接使用
db.escape_string()的联接不感兴趣,尽管如果没有其他方法,我最终可能会走这条路。
我真正追求的是一个干净的习惯用法,它绑定命名的可迭代参数(如果有的话)。
【问题讨论】:
标签: python mysql python-3.x mysql-python named-parameters