Python SQL语句中%(name)s占位符的作用是什么?
Python SQL语句中
%(name)s用法说明 这是Python百分号字符串格式化体系下的命名占位符语法,不属于SQL原生语法,是Python数据库驱动做参数替换的标准规则,和常见的位置占位符%s属于同一套实现逻辑。
具体语法规则
- 常规的百分号位置格式化需要按顺序传入参数,示例:
print("我的名字是%s,今年%d岁" % ("李明", 25))
当参数数量较多时很容易出现顺序错位的问题。 - 命名占位符通过字典映射传参,不需要严格匹配参数顺序,可读性和容错性更高,示例:
print("我的名字是%(name)s,今年%(age)d岁" % {"name": "李明", "age": 25})
其中%(key)部分的key对应传入字典的键,末尾的s/d等字符是类型标识,和常规百分号格式化的类型规则完全一致,s代表字符串类型、d代表整数类型、f代表浮点数类型。
SQL场景的实现逻辑
你看到的SQL语句执行时,Python数据库驱动会将占位符和传入的参数字典做匹配替换,无需开发者手动拼接字符串,示例执行代码:
import MySQLdb # 数据库连接代码省略 cursor = db.cursor() sql = 'select "modified" from tabDocType where "name" = %(name)s order by modified desc' # 参数字典的key要和SQL中的占位符名称完全对应 params = {"name": "用户管理"} cursor.execute(sql, params)
- 目前绝大多数Python关系型数据库驱动(MySQLdb、pymysql、psycopg2等)都原生支持这种命名占位符的传参方式
- 用驱动自带的参数传参机制替换占位符,而非手动用
%运算符拼接SQL,可以有效避免SQL注入风险,是SQL操作的最佳实践之一 - 你此前查阅的百分号转义规则是用于输出百分号本身时用
%%做转义,确实和当前命名占位符的场景无关。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

