使用sqlalchemy创建的雪花表需要引号(“”)进行查询

rwqw0loc  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(474)

我使用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是否自动创建带引号的表?这是架构的问题吗?这不是我安排的。有办法解决这个问题吗?
谢谢你的帮助,非常感谢!

wdebmtf2

wdebmtf21#

从sqlalchemy雪花github文档:
对象名称大小写处理
snowflake以大写文本存储所有不区分大小写的对象名称。相比之下,sqlalchemy认为所有小写对象名都不区分大小写。雪花sqlalchemy在模式级通信期间(即在表和索引反射期间)转换对象名称大小写。如果使用大写的对象名,sqlalchemy会假定它们区分大小写,并用引号括起来。此行为将导致与从snowflake接收的ISNT数据字典数据不匹配,因此除非使用引号(例如“testdb”)将标识符名称真正创建为区分大小写的名称,否则所有小写名称都应在sqlalchemy端使用。
我想这是想说的是sqlalchemy将任何包含大写字母的名称视为区分大小写的,并自动将它们括在引号中,反之,任何小写的名称都不会被引用。看起来这种行为是不可配置的。
您可能无法控制数据库名称,也可能无法控制模式名称,但在创建表时,如果您想要一致的行为,无论是带引号的还是不带引号的,那么您应该坚持使用小写命名。您应该发现,无论您是否使用 "my_table"my_table .

相关问题