首页 > 解决方案 > 使用 sqlalchemy 创建的雪花表需要引号 ("") 才能查询

问题描述

我正在使用 python 和 sqlalchemy 将数据摄取到雪花表中。我创建的这些表都需要引号来查询表名和列名。例如: select * from "database"."schema"."table" where "column" = 2;会运行,而select * from database.schema.table where column = 2;不会运行。区别在于引号。

我了解,如果在 Snowflake 中创建带有引号的表,则需要使用引号来查询它。但是,我只在 pandas 数据框中放置了一个 excel 文件,然后使用 sqlalchemy 和 pd.to_sql 创建表。我的代码示例:

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',
))

connection = engine.connect()

df.to_sql('My_Table', con=engine, if_exists='replace', index=False, index_label=None, chunksize=16384)

sqlalchemy 会自动创建带引号的表吗?这是架构的问题吗?我没有设置。有没有解决的办法?

感谢您的帮助,非常感谢!

标签: pythonsqlpandassqlalchemysnowflake-cloud-data-platform

解决方案


来自 SQLAlchemy Snowflake Github 文档

对象名称大小写处理
Snowflake 以大写文本存储所有不区分大小写的对象名称。相反,SQLAlchemy 认为所有小写的对象名称都是不区分大小写的。Snowflake SQLAlchemy 在模式级通信期间转换对象名称大小写,即在表和索引反射期间。如果您使用大写的对象名称,SQLAlchemy 假定它们区分大小写并用引号将名称括起来。此行为将导致与从 Snowflake 接收的数据字典数据不匹配,因此除非标识符名称已使用引号真正创建为区分大小写,例如“TestDb”,否则应在 SQLAlchemy 端使用所有小写名称。

我认为这想说的是 SQLAlchemy 将任何包含大写字母的名称视为区分大小写并自动将它们括在引号中,相反,任何小写字母的名称都不会被引用。看起来这种行为是不可配置的。

您可能对数据库和可能的模式名称没有任何控制权,但是在创建表时,如果您想要一致的行为(无论是带引号的还是不带引号的),那么您应该坚持使用小写命名。您应该发现,无论您使用"my_table"还是,表名都将起作用my_table


推荐阅读