【问题标题】:Can't append to an existing table. Fails silently无法追加到现有表。默默地失败
【发布时间】:2021-01-03 20:39:27
【问题描述】:

我正在尝试将 pandas DataFrame 转储到现有的 Snowflake 表中(通过 jupyter 笔记本)。 当我运行下面的代码时,没有出现错误,但没有数据写入目标 SF 表(df 有大约 800 行)。

from sqlalchemy import create_engine
from snowflake.sqlalchemy import URL

sf_engine = create_engine(
    URL(
        user=os.environ['SF_PROD_EID'],
        password=os.environ['SF_PROD_PWD'],
        account=account,
        warehouse=warehouse,
        database=database,
    )
)

df.to_sql(
    "test_table",
    con=sf_engine,
    schema=schema,
    if_exists="append",
    index=False,
    chunksize=16000,
)

如果我查看 SF 历史记录,我可以看到查询显然运行没有问题:

如果我从 SF History UI 中提取查询并在 Snowflake UI 中手动运行,则数据会显示在目标表中。

如果我尝试使用 locopy,我会遇到同样的问题。

如果表不存在,上面的代码创建表并删除行没有问题。

这就是奇怪的地方。当我运行pd.to_sql 命令尝试追加然后删除目标表时,如果我随后发出select count(*) from destination_table,则该名称仍然存在并且(仅)具有我一直试图删除的数据。认为这可能是区分大小写的表命名情况?

感谢任何见解:)

【问题讨论】:

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


    【解决方案1】:

    尝试在 URL 中添加 role="<role>"schema="<schema>"

    engine = create_engine(URL(
            account=os.getenv("SNOWFLAKE_ACCOUNT"),
            user=os.getenv("SNOWFLAKE_USER"),
            password=os.getenv("SNOWFLAKE_PASSWORD"),
            role="<role>",
            warehouse="<warehouse>",
            database="<database>",
            schema="<schema>"
        ))
    

    【讨论】:

      【解决方案2】:

      问题在于我如何设置数据库连接以及表名是否区分大小写。原来我正在写一个名为DB.SCHEMA."db.schema.test_table" 的表(请注意,db.schema slug 变成了表名的一部分)。不要像我这样的孩子。在 Snowflake 中使用大写的表名!

      【讨论】:

        猜你喜欢
        • 2018-06-18
        • 2011-01-03
        • 2019-08-02
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多