如何将点分隔的全限定表名作为参数传入Snowflake的SQL查询
问题原因
你遇到的报错本质是SQL参数绑定默认会将传入值作为字符串常量处理,而表名属于SQL标识符,不能直接以字符串形式传入。你之前的写法里,绑定的foo.bar.baz会被解析为带单引号的'foo.bar.baz',SQL语法不支持select * from '字符串'的写法,Snowflake误将带点的字符串识别为URL路径,才抛出了对应的错误。
解决方案(无需修改连接对象)
推荐使用Snowflake内置的IDENTIFIER()函数处理动态标识符,该函数可以直接将输入的字符串解析为合法的SQL标识符,天然支持数据库.模式.表名这种带点的全限定名结构,示例代码如下:
cur.execute(''' select * from IDENTIFIER(%(tbl)s) ''', {'tbl': 'foo.bar.baz'} )
如果你的表名是完全可控的内部参数,也可以拆分全限定名的各段,手动转义后拼接SQL:
# 拆分三层全限定名,分别用双引号包裹避免特殊字符问题 db_name, schema_name, table_name = "foo.bar.baz".split(".") safe_qualified_name = f'"{db_name}"."{schema_name}"."{table_name}"' cur.execute(f''' select * from {safe_qualified_name} ''' )
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

