web-dev-qa-db-fra.com

Comment puis-je remplir un pandas DataFrame avec le résultat d'une requête SQL Snowflake?

En utilisant Python Connector je peux interroger Snowflake:

import snowflake.connector

# Gets the version
ctx = snowflake.connector.connect(
    user=USER,
    password=PASSWORD,
    account=ACCOUNT,
    authenticator='https://XXXX.okta.com',
    )
ctx.cursor().execute('USE warehouse MY_WH')
ctx.cursor().execute('USE MYDB.MYSCHEMA')


query = '''
select * from MYDB.MYSCHEMA.MYTABLE
LIMIT 10;
'''

cur = ctx.cursor().execute(query)

Le résultat est un snowflake.connector.cursor.SnowflakeCursor. Comment puis-je convertir cela en un pandas DataFrame?

8
ecerulm

Vous pouvez utiliser DataFrame.from_records() ou pandas.read_sql() avec snowflake-sqlalchemy . L'option de flocon de neige-alchimie a une API plus simple

pd.DataFrame.from_records(iter(cur), columns=[x[0] for x in cur.description])

renverra un DataFrame avec des noms de colonne appropriés extraits du résultat SQL. La iter(cur) convertira le curseur en itérateur et cur.description Donne les noms et les types des colonnes.

Le code complet sera donc

import snowflake.connector
import pandas as pd

# Gets the version
ctx = snowflake.connector.connect(
    user=USER,
    password=PASSWORD,
    account=ACCOUNT,
    authenticator='https://XXXX.okta.com',
    )
ctx.cursor().execute('USE warehouse MY_WH')
ctx.cursor().execute('USE MYDB.MYSCHEMA')


query = '''
select * from MYDB.MYSCHEMA.MYTABLE
LIMIT 10;
'''

cur = ctx.cursor().execute(query)
df = pd.DataFrame.from_records(iter(cur), columns=[x[0] for x in cur.description])

Si vous préférez utiliser pandas.read_sql, Vous pouvez

import pandas as pd

from sqlalchemy import create_engine
from snowflake.sqlalchemy import URL


url = URL(
    account = 'xxxx',
    user = 'xxxx',
    password = 'xxxx',
    database = 'xxx',
    schema = 'xxxx',
    warehouse = 'xxx',
    role='xxxxx',
    authenticator='https://xxxxx.okta.com',
)
engine = create_engine(url)


connection = engine.connect()

query = '''
select * from MYDB.MYSCHEMA.MYTABLE
LIMIT 10;
'''

df = pd.read_sql(query, connection)
2
ecerulm