【问题标题】:Snowflake table created with sqlalchemy requires quotes ("") to query使用 sqlalchemy 创建的雪花表需要引号 ("") 才能查询
【发布时间】:2021-09-19 06:11:53
【问题描述】:

我正在使用 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 会自动创建带引号的表吗?这是架构的问题吗?我没有设置。有没有办法解决这个问题?

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

【问题讨论】:

  • 您的一个或多个对象(db/schema/table/column)是否不符合未加引号的标识符的要求?
  • 架构中的所有列和表都不符合取消引用标识符的要求。但是,我使用上述方法(sqlalchemy)在此模式中创建了所有表。可以不带引号查询数据库中的其他模式。

标签: python sql pandas sqlalchemy snowflake-cloud-data-platform


【解决方案1】:

来自 SQLAlchemy Snowflake Github documentation

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 2022-07-26
    • 1970-01-01
    • 2020-05-22
    • 2020-03-01
    • 2021-10-02
    • 2022-01-04
    • 2022-06-11
    相关资源
    最近更新 更多