Как подключить 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
)
Другие вопросы по тегам