Как подключить SQLAlchemy к базе данных Snowflake с помощью OAuth2?
Мне нужно подключиться к Snowflake с помощью SQLAlchemy, но хитрость в том, что мне нужно пройти аутентификацию с помощью OAuth2. Документация Snowflake описывает только подключение с использованием имени пользователя и пароля, и это не может быть использовано в решении, которое я создаю. Я могу пройти аутентификацию с помощью коннектора Python Snowflake, но я не вижу простого пути, как склеить его с помощью SQLAlchemy. Я хотел бы знать, есть ли готовое решение, прежде чем писать для этого собственный интерфейс.
2 ответа
Использовать
snowflake.connector.connect
для создания соединения PEP-249 с базой данных — см. документацию . Затем используйте параметр
creator
из
create_engine
(docs) — требуется вызываемый объект, который возвращает PEP-249 Connection. Если вы используете его, то параметр URL игнорируется.
Пример кода:
def get_connection():
return snowflake.connector.connect(
user="<username>",
host="<hostname>",
account="<account_identifier>",
authenticator="oauth",
token="<oauth_access_token>",
warehouse="test_warehouse",
database="test_db",
schema="test_schema"
)
engine = create_engine("snowflake://not@used/db", creator=get_connection)
У меня это работает, но я просто добавил больше параметров в URL-адрес подключения:
from sqlalchemy.engine import create_engine
import urllib.parse
connection_url = f"snowflake://{user}:@{account}/{database}/{schema}?warehouse={warehouse}&authenticator=oauth&token={urllib.parse.quote(access_token)}"
engine = create_engine(connection_url)
with engine.begin() as connection:
print(connection.execute('select count(*) from lineitem').fetchone())
Если вы не хотите создавать URL-адрес самостоятельно, вы можете использоватьsnowflake.sqlalchemy.URL
так:
from snowflake.sqlalchemy import URL
connection_url = URL(
user=user,
authenticator="oauth",
token=access_token,
host=host,
account=account,
warehouse=warehouse,
database=database,
schema=schema
)