python - 使用 key 对身份验证的 Snowflake 的 SQLAlchemy engine.connect() 失败

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

我的目标是能够使用 to_sql() 函数将 pandas 数据帧写入 Snowflake。我能够使用 read_sql() 从 Snowflake 成功查询,没有任何问题。似乎 to_sql() 需要一个我无法弄清楚的稍微不同的配置。我尝试了下面概述的两种不同方法。

我在猜测,但 key 对身份验证似乎是问题所在,这可能是错误的。当我在这两种方法中删除私钥参数时,我都会收到密码丢失的错误,而不是我收到的特别不清楚的错误。也许没有指定密码会使尝试短路,我真的遇到了另一个问题。

或者,如果有更好的方法将整个 pandas 数据框写入 Snowflake,我很乐意接受其他选择。

方法一雪花连接器

编辑:如果连接不是 SQLAlchemy 连接,那么 sqllite 似乎是唯一受支持的数据库

此方法因 DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': not all arguments converted during string formatting 而失败

import snowflake

conn = snowflake.connector.connect(
    account=acct,
    warehouse=wh,
    database=db,
    schema=sc,
    user=usr,
    private_key=pkb,
)

df.to_sql('TABLENAME', con=conn, if_exists='replace', index=False)

方法二——SQLAlchemy引擎

我找到了有关如何将私钥用于 SQLAlchemy 的文档。但是,它在调用 engine.connect() 时失败并显示 ValueError: Invalid IPv6 URL...

from snowflake.sqlalchemy import URL
from sqlalchemy import create_engine

engine = create_engine(URL(
    account=acct,
    warehouse=wh,
    database=db,
    schema=sc,
    user=usr,
    connect_args={
        'private_key': pkb,
    }
))

with engine.connect() as conn:
    df.to_sql('TABLENAME', con=conn, if_exists='replace', index=False)

这两个错误的回溯都很长,但如果有助于解决问题,我很乐意发布它们。

最佳答案

我不知道 #2 有什么问题,但我发现结合 #1 和 #2 会起作用...

import snowflake.connector
from sqlalchemy import create_engine

conn = snowflake.connector.connect(
    account=acct,
    warehouse=wh,
    database=db,
    schema=sc,
    user=usr,
    private_key=pkb,
)

engine = create_engine(f"snowflake://{acct}.snowflakecomputing.com", creator=lambda: conn)

try:
    with engine.connect() as c:
        # Note: the table name MUST be all lowercase for some reason, even though Snowflake uses all caps
        df.to_sql('TABLENAME'.lower(), con=c, if_exists='replace', index=False)
finally:
    engine.dispose()
    conn.close()

关于python - 使用 key 对身份验证的 Snowflake 的 SQLAlchemy engine.connect() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60870620/

相关文章:

pandas - 识别 PySpark DF ArrayType 列上运行的干净方法

python - 向使用 Python 的每个人授予对 Vertica SQL 表的访问权限

python - Theano 的 dimshuffle 的 Tensorflow 等价物

python - 连接 pandas 数据框中的元组列表

python - Pandas 使用 read_sql_table 占用过多内存

python - 停止/删除在 SQLAlchemy 中默认插入 NULL

python - 单个 python 脚本文件中的 sqlalchemy

python - 使用 gdata-python-client 和 OAuth2 token 从 Google Contacts API 检索所有(其他)联系人?

python - Visual Studio Code - Python 中的输入函数

python - df.groupby(.pdGrouper(freq ='D' ) ).idxmax 抛出 ValueError