Python SQLAlchemy engine.connect()使用密钥对身份验证为Snowflake失败

Python SQLAlchemy engine.connect()使用密钥对身份验证为Snowflake失败,python,pandas,sqlalchemy,snowflake-cloud-data-platform,Python,Pandas,Sqlalchemy,Snowflake Cloud Data Platform,我的目标是能够使用to_sql()函数将pandas数据帧写入Snowflake。我能够使用read\u sql()成功地从Snowflake查询,没有问题。似乎to_sql()需要一个稍微不同的配置,我想不出来。我已经尝试了下面概述的两种不同的方法 我猜,但可能是错误的,密钥对身份验证似乎是问题所在。当我在这两种方法中删除私钥参数时,我会得到一个密码丢失的错误,而不是我在其他方法中得到的特别不清楚的错误。也许没有指定密码会使尝试短路,我真的有另一个问题 或者,如果有更好的方法将整个熊猫数据帧写

我的目标是能够使用
to_sql()
函数将pandas数据帧写入Snowflake。我能够使用
read\u sql()
成功地从Snowflake查询,没有问题。似乎to_sql()需要一个稍微不同的配置,我想不出来。我已经尝试了下面概述的两种不同的方法

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

或者,如果有更好的方法将整个熊猫数据帧写入Snowflake,我很乐意考虑其他选择

方法1雪花连接器 编辑:如果连接不是SQLAlchemy连接,则sqllite似乎是唯一受支持的数据库

此方法失败,原因是
DatabaseError:在sql“从sqlite_master中选择名称,其中type='table'和name=?;”上执行失败:并非所有参数都在字符串格式化过程中转换

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)
方法2-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()