SQLAlchemy创建Snowflake表后查询表名列名需加引号如何解决
问题原因分析
1. SQLAlchemy自动加引号的逻辑
Snowflake官方提供的SQLAlchemy驱动默认会对包含非大写字符、特殊字符的标识符(库名、Schema名、表名、列名)自动添加双引号,保留原大小写。而Snowflake本身的语法规则中,不带双引号的标识符会被自动转换为全大写,所以就会出现大小写不匹配、查询失败的问题。
你的代码中My_Database、My_Schema、My_Table均为混合大小写,DataFrame读取Excel后的列名大概率也是混合大小写/驼峰格式,因此建表时所有标识符都会被自动加双引号。
2. 是否和Schema配置有关
该问题和Schema配置本身无关,和你配置的Schema名称的大小写格式有关,你使用的My_Schema包含大写字母和下划线,触发了自动加引号的逻辑。
可行解决方案
方案1:统一将所有标识符改为全大写
这是最符合Snowflake语法规范的方案,修改点如下:- 引擎配置中的库、Schema、仓库、角色名称全部改为全大写
- 调用
to_sql时传入的表名改为全大写 - 导入DataFrame前先把列名统一转为全大写:
# 列名转全大写 df.columns = [col.upper() for col in df.columns] # 引擎配置和表名也全大写 engine = create_engine(URL( account = 'my_account', user = 'my_username', password = 'my_password', database = 'MY_DATABASE', schema = 'MY_SCHEMA', warehouse = 'MY_WH', role='MY ROLE', )) df.to_sql('MY_TABLE', con=engine, if_exists='replace', index=False, chunksize=16384)修改后建表时不会自动加双引号,不带引号的查询可以正常执行。
方案2:关闭SQLAlchemy自动加引号的配置
如果不想修改标识符命名,可以在创建引擎时添加quote_identifiers=False参数,强制关闭自动加引号逻辑:
engine = create_engine(URL( account = 'my_account', user = 'my_username', password = 'my_password', database = 'My_Database', schema = 'My_Schema', warehouse = 'My_Wh', role='My Role', ), quote_identifiers=False)
该配置下,Snowflake会自动将所有标识符转为全大写存储,后续查询时无需加双引号即可正常执行。
- 方案3:保留大小写,查询时强制加双引号
如果业务要求必须保留标识符的大小写格式,只能遵循Snowflake的语法规则,所有查询语句中涉及库、Schema、表、列的部分都加双引号,不推荐该方案,会增加后续查询的编写成本。
内容的提问来源于stack exchange,提问作者Zach Hinds
相关产品推荐
相关产品推荐

