如何构造含单引号参数的Snowflake查询,实现参数正确转义?
问题描述
我用Python生成Snowflake查询的代码如下:
name_list = ("O'Reley", "de'Medici") query = f''' SELECT * FROM "mydb"."myschema"."mytable" WHERE NAME IN {name_list} '''
需要构造name_list,让最终生成的Snowflake查询变为:
SELECT * FROM "mydb"."myschema"."mytable" WHERE NAME IN ('O''Reley', 'de''Medici')
解决方案
方法1:手动转义单引号
直接在name_list的每个字符串里,把单个单引号替换成两个单引号(Snowflake要求用双单引号转义字符串内的单引号):
name_list = ("O''Reley", "de''Medici") query = f''' SELECT * FROM "mydb"."myschema"."mytable" WHERE NAME IN {name_list} '''
Python格式化时会自动为元组内的每个元素包裹单引号,转义后的双单引号会直接保留在最终的SQL语句中,符合Snowflake语法要求。
方法2:自动转义(适配动态场景)
如果名字是从外部数据源获取(比如用户输入、数据库读取),可以写个简单函数自动处理单引号,避免手动操作的疏漏:
def escape_snowflake_str(s): return s.replace("'", "''") original_names = ("O'Reley", "de'Medici") name_list = tuple(escape_snowflake_str(name) for name in original_names) query = f''' SELECT * FROM "mydb"."myschema"."mytable" WHERE NAME IN {name_list} '''
生产环境推荐:参数化查询
如果是正式项目,不建议直接通过字符串拼接生成SQL,优先使用Snowflake Python Connector的参数化查询功能,它会自动处理转义,还能避免SQL注入风险:
import snowflake.connector original_names = ("O'Reley", "de'Medici") query = ''' SELECT * FROM "mydb"."myschema"."mytable" WHERE NAME IN (%s) ''' # 初始化连接 conn = snowflake.connector.connect( user='your_user', password='your_pwd', account='your_account' ) cursor = conn.cursor() cursor.execute(query, (original_names,))
内容的提问来源于stack exchange,提问作者Mr369
相关产品推荐
相关产品推荐

