Ошибка атрибута: объект ‘SnowflakeCursor’ не имеет атрибута ‘cursor’

#python #pandas #snowflake-cloud-data-platform

#python #панды #snowflake-cloud-data-platform

Вопрос:

Я пытаюсь записать свой фрейм данных в Snowflake, используя метод to_sql.

 sf_conn = snowflake.connector.connect(
    account=*****,
    user=*****,
    password=*****,
    role=*****,
    warehouse=*****,
    database=*****
    
)

sf_cur = sf_conn.cursor()
df = pd.DataFrame([('Mark', 10), ('Luke', 20)], columns=['name', 'balance'])
df.to_sql('TEST3',con=sf_cur, schema='public', index=False)
  

Но пока не повезло.

 File "/home/karma/.local/lib/python3.6/site-packages/pandas/io/sql.py", line 1584, in execute
    cur = self.con.cursor()
AttributeError: 'SnowflakeCursor' object has no attribute 'cursor'
  

Даже пытался дать con=sf_conn , но получил следующую ошибку:

 pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': not all arguments converted during string formatting
  

Я могу выполнить ту же работу, используя SQLAlchemy create_engine lib, но хотел использовать именно snowflake connection.

Ответ №1:

Вам необходимо использовать механизм SQLAlchemy в качестве соединения при использовании pandas.DataFrame.to_sql со снежинкой.

При использовании вам df.to_sql нужно передать движок SQLAlchemy, а не стандартный объект подключения Snowflake (и не курсор, как вы пытались сделать). Вам нужно будет установить snowflake-sqlalchemy с помощью pip, но вам не нужно устанавливать snowflake-connector-python , поскольку snowflake-sqlalchemy делает это за вас.

Вот пример:

 from sqlalchemy import create_engine
import os
import pandas as pd

snowflake_username = os.environ['SNOWFLAKE_USERNAME']
snowflake_password = os.environ['SNOWFLAKE_PASSWORD']
snowflake_account = os.environ['SNOWFLAKE_ACCOUNT']
snowflake_warehouse = os.environ['SNOWFLAKE_WAREHOUSE']
snowflake_database = 'test_db'
snowflake_schema = 'public'


if __name__ == '__main__':
    engine = create_engine(
        'snowflake://{user}:{password}@{account}/{db}/{schema}?warehouse={warehouse}'.format(
            user=snowflake_username,
            password=snowflake_password,
            account=snowflake_account,
            db=snowflake_database,
            schema=snowflake_schema,
            warehouse=snowflake_warehouse,
        )
    )
    df = pd.DataFrame([('Mark', 10), ('Luke', 20)], columns=['name', 'balance'])
    df.to_sql('TEST_TABLE', con=engine, schema='public', index=False, if_exists='append')
  

Каждый раз, когда я запускаю приведенный выше скрипт, записи Mark и Luke добавляются к моей test_db.public.test_table таблице.