我正在尝试使用 Snowflake.connector 包从我的 Python 代码连接到 Snowflake。 不幸的是,由于遗留代码,我只能在 python 3.7.3 上使用 Snowflake 连接器版本 3.0.3,并且无法升级
我确实设法从我自己的计算机进行连接,使用:
con = Snowflake.connector。连接( ... 私有密钥文件 = <私有密钥路径> ... )
所以我知道这有效。但是,我使用 3.8.1 版本的连接器,并且稍后添加了 private_key_file 参数。
如何在旧版本的雪花 python 连接器上使用密钥对进行连接
是对的,Snowflake 连接器 3.0.3 版本不支持
private_key_file
参数。该参数是在更高版本中添加的,以简化使用密钥对进行身份验证。
以下是在 Snowflake 连接器 3.0.3 中使用密钥对进行身份验证的方法:
-
使用
cryptography
包加载私钥:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
with open("<私钥路径>", "rb") as key:
private_key = serialization.load_pem_private_key(
key.read(),
password=None, # 如果私钥有密码,请在此处提供
backend=default_backend()
)
- 使用私钥对连接字符串进行签名:
import json
# 构造 Snowflake 连接字符串
connection_parameters = {
"account": "<account>",
"user": "<user>",
"warehouse": "<warehouse>",
"database": "<database>",
"schema": "<schema>"
}
connection_string = json.dumps(connection_parameters, separators=(',', ':'))
# 使用私钥对连接字符串进行签名
signature = private_key.sign(
connection_string.encode('utf-8'),
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
- 将签名传递给连接器:
con = snowflake.connector.connect(
account="<account>",
user="<user>",
private_key=signature,
... # 其他连接参数
)
请注意,需要将
<account>
、
<user>
、
<warehouse>
、
<database>
和
<schema>
替换为的实际值,并将
<私钥路径>
替换为的私钥文件路径。
This approach manually loads the private key, signs the connection string, and passes the signature to the connector. This method achieves the same outcome as using the
private_key_file
parameter in later versions.