Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Snowflake Python Pandas Connector - Unknown error using fetch_pandas_all

I am trying to connect to snowflake using the python pandas connector.

I use the anaconda distribution on Windows, but uninstalled the existing connector and pyarrow and reinstalled using instructions on this page: https://docs.snowflake.com/en/user-guide/python-connector-pandas.html

I have the following versions

pandas 1.0.4 py37h47e9c7a_0

pip 20.1.1 py37_1

pyarrow 0.17.1 pypi_0 pypi

python 3.7.7 h81c818b_4

snowflake-connector-python 2.2.7 pypi_0 pypi

When running step 2 of this document: https://docs.snowflake.com/en/user-guide/python-connector-install.html, I get: 4.21.2

On attempting to use fetch_pandas_all() I get an error: NotSupportedError: Unknown error

enter image description here

The code I am using is as follows:

import snowflake.connector
import pandas as pd

SNOWFLAKE_DATA_SOURCE = '<DB>.<Schema>.<VIEW>'

query = '''
select * 
from table(%s)
LIMIT 10;
'''
def create_snowflake_connection():
    conn = snowflake.connector.connect(
            user='MYUSERNAME',
            account='MYACCOUNT',
            authenticator = 'externalbrowser',
            warehouse='<WH>',
            database='<DB>',
            role='<ROLE>',
            schema='<SCHEMA>'
    )
    
    return conn

con = create_snowflake_connection()

cur = con.cursor()
temp = cur.execute(query, (SNOWFLAKE_DATA_SOURCE)).fetch_pandas_all()
cur.close()

I am wondering what else I need to install/upgrade/check in order to get fetch_pandas_all() to work?

Edit: After posting an answer below, I have realised that the issue is with the SSO (single sign on) with authenticator='externalbrowser'. When using a stand-alone account I can fetch.

like image 413
user1420372 Avatar asked Jun 07 '26 00:06

user1420372


2 Answers

I found a workaround that avoids the SSO error by relying on fetchall() instead of fetch_all_pandas():

try: 
    cur.execute(sql)
    all_rows = cur.fetchall()
    num_fields = len(cur.description)
    field_names = [i[0] for i in cur.description]
finally:
    cur.close()

con.close()

df = pd.DataFrame(all_rows)
df.columns = field_names
like image 160
Colin Avatar answered Jun 10 '26 09:06

Colin


The reason is snowflake-connector-python does not install "pyarrow" which you need to play with pandas.

Either you could install and Import Pyarrow or

Do :

pip install "snowflake-connector-python[pandas]"

and try it .

like image 38
Clement Davis Avatar answered Jun 10 '26 07:06

Clement Davis