如何将多段SQL查询存入单个Jinja2模板文件并从Python调用
单个Jinja2模板管理多SQL查询方案
1. 创建统一模板文件
将所有SQL查询存入单个模板(比如命名为all_queries.j2),用Jinja2字典变量统一管理每个查询,方便分类和扩展:
{% set sql_queries = { # 查询类语句 'select_employees': "select * from employee.details where department='cse'", 'select_dept_employees': "select * from employee.details where department='{{ department }}'", # 操作类语句 'insert_employee': "insert into employee.details (name, department) values ('{{ name }}', '{{ department }}')", 'update_employee_dept': "update employee.details set department='{{ new_department }}' where id={{ employee_id }}", 'delete_employee': "delete from employee.details where id={{ employee_id }}" # 后续新增查询直接在字典中添加键值对即可 } %}
2. Python代码中加载并调用查询
通过Jinja2模板的module属性直接获取模板内定义的查询字典,带参数的查询可通过from_string二次渲染注入参数:
from jinja2 import Environment, FileSystemLoader def load_sql_queries(template_path): file_loader = FileSystemLoader(template_path) env = Environment(loader=file_loader) # 加载统一查询模板 query_template = env.get_template('all_queries.j2') # 直接获取模板中定义的查询字典 return query_template.module.sql_queries, env def main(): sql_queries, env = load_sql_queries('path/to/templates') # 使用无参数查询 basic_select = sql_queries['select_employees'] print("基础查询:", basic_select) # 使用带参数的查询,二次渲染注入参数 dept_select = env.from_string(sql_queries['select_dept_employees']).render(department='ece') print("部门查询:", dept_select) # 插入操作示例 insert_query = env.from_string(sql_queries['insert_employee']).render(name='Alice', department='it') print("插入语句:", insert_query) if __name__ == '__main__': main()
3. 注意事项
- SQL字符串中的引号需区分使用,避免语法错误,比如用单引号包裹整个SQL语句,内部字段值用双引号,或者反过来
- 涉及数据库操作时,不要仅依赖Jinja2渲染参数保证安全,建议结合数据库驱动的参数化查询(如
cursor.execute(query, params))防止SQL注入 - 可在模板中添加注释,标注每个查询的用途、参数说明,提升维护效率
内容的提问来源于stack exchange,提问作者Akhil
相关产品推荐
相关产品推荐

