SQLAlchemy engine.connect () завершается с ошибкой для Snowflake с использованием аутентификации пары ключей - PullRequest
0 голосов
/ 26 марта 2020

Моя цель - записать pandas фрейм данных в Snowflake с помощью функции to_sql(). Я могу успешно запросить от Снежинки, используя read_sql() без проблем. Похоже, что to_ sql () требует немного другой конфигурации, которую я не могу понять. Я пробовал два разных подхода, которые я обрисовал в общих чертах ниже.

Я предполагаю, но могу ошибаться из-за проблемы с аутентификацией пары ключей. Когда я удаляю параметр закрытого ключа в обоих подходах, я получаю ошибку, что пароль отсутствует, а не особо непонятные ошибки, которые я получаю в противном случае. Возможно, отсутствие указанного пароля приводит к короткому замыканию попытки, и у меня действительно есть другая проблема.

С другой стороны, если есть лучший способ записать целый pandas фрейм данных в Snowflake, я рад принять другие варианты ,

Метод 1 Snowflake Connector

edit: кажется, что sqllite является единственной поддерживаемой базой данных, если соединение не является соединением SQLAlchemy .

Этот подход не работает с 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)

Метод 2 - SQLAlchemy Engine

Я нашел документацию о том, как использовать закрытый ключ с SQLAlchemy. Тем не менее, происходит сбой при ValueError: Invalid IPv6 URL при вызове engine.connect() ...

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)

Отслеживание обеих этих ошибок очень длинное, но я рад опубликовать их, если это поможет устранить неполадки .

1 Ответ

0 голосов
/ 27 марта 2020

Я не знаю, что не так с # 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()
...