You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:11:05