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

如何不使用execute游标方法向SQL查询传递元组参数?

问题描述

我创建了如下列表并转换为元组:

at_lst = ['131','132','133']

at_tup = (*at_lst,)
 
print(at_tup)
# 输出: ('131','132','133')

尝试在%%sql魔法命令中传递该元组作为参数,却无法得到结果:

%%sql
select * from main.schema.tbl
where code IN ( '{{ at_tup }}' )

但直接在查询中写入实际元组值时,就能得到预期结果:

select * from main.schema.tbl
where code IN ('131','132','133')

请问如何不使用execute游标对象方法向SQL查询传递元组参数?

解决方法
  • 方法1:格式化元组为SQL兼容字符串
    把元组元素逐个用单引号包裹,拼接成符合IN子句要求的字符串格式,再传入魔法命令:

    # 处理元组生成SQL可识别的字符串
    formatted_codes = ", ".join(f"'{item}'" for item in at_tup)
    

    然后在查询中使用:

    %%sql
    select * from main.schema.tbl
    where code IN ( {{ formatted_codes }} )
    
  • 方法2:预拼接完整查询语句
    在Python中直接拼接好带参数的完整查询字符串,再传给%%sql执行:

    query = f"select * from main.schema.tbl where code IN ({', '.join(f"'{c}'" for c in at_tup)})"
    

    执行查询:

    %%sql {query}
    
  • 方法3:用SQLAlchemy参数绑定(更安全)
    如果环境支持SQLAlchemy,可通过参数绑定方式传递,避免手动拼接字符串带来的SQL注入风险:

    from sqlalchemy import text
    
    # 构造带参数占位符的查询语句
    stmt = text("select * from main.schema.tbl where code IN :codes")
    

    执行查询并传入参数:

    %%sql << stmt
    params={'codes': at_tup}
    

内容的提问来源于stack exchange,提问作者kms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:32:34