使用JinjaSql时绑定参数名被自动添加_1后缀的原因及解决方法
问题原因
这是JinjaSql的默认设计行为,不是运行逻辑错误。为了避免同一个参数在SQL模板中被多次引用时出现命名冲突,库内置的参数命名规则会自动给每个绑定参数追加计数器后缀,哪怕你只引用了一次{{myid}},也会生成带_1后缀的参数名。
另外你贴的代码片段里有一处语法笔误:实例化JinjaSql的行尾用了右大括号}而非右括号),如果你的实际运行代码也是这么写的会直接触发语法错误,若你已经能正常打印bind_params结果,说明这个只是粘贴时的输入错误,可忽略。
修复方案
你可以根据自己的使用场景选任意一种方案:
- 方案1:无需修改命名规则,直接使用生成的结果
调用prepare_query返回的myquery中的占位符已经同步替换为%(myid_1)s,直接把两个返回值传给数据库驱动执行即可,后缀不影响实际运行效果。 - 方案2:自定义参数命名规则,取消自动加后缀的行为
初始化JinjaSql时传入自定义的key_generator参数,直接返回原参数名即可:
此时打印from jinjasql import JinjaSql query = ''' SELECT * FROM table WHERE id = {{myid}}''' params = {'myid':3} # 自定义key生成规则,直接返回原始参数名 j = JinjaSql(param_style='pyformat', key_generator=lambda orig_key, counter: orig_key) myquery, bind_params = j.prepare_query(query,params)bind_params就会得到{'myid':3}的结果。注意该方案下如果同一个参数在模板中被多次引用,绑定参数只会保留一份,不会重复生成。
内容的提问来源于stack exchange,提问作者BNB
相关产品推荐
相关产品推荐

