我的目标是能够使用 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/