繁体   English   中英

尝试使用 Python 和 Snowflake-Connector 使用 Excel 列表中的值列表查询 Snowflake

[英]Trying to query Snowflake with a list of values from an Excel List using Python and Snowflake-Connector

我在工作中收到了一个项目,试图取代 excel 文件中材料清单中的部件号。 我有一个查询,我编写了一个通过自联接运行部件的查询,该自联接基本上会取代这些部件。 我可以手动操作 excel 文件并使查询通过雪花返回我需要的内容。 如果我们能够成功地将其转变为自动化,我们可能会收到更多此类请求。 这将节省大量的体力劳动时间。 一旦我弄清楚这个雪花连接器问题,我想将结果加载到 excel 电子表格的新列中。

我已经成功地从 excel 文件中提取了带有部件号列表的列,并使用 sqlalchemy URL 对雪花进行了身份验证。 现在我正在尝试应用我的 SQL 查询,但遇到了障碍。 我已经阅读了 SQLAlchemy 和 Snowflake Python 连接器文档,但我似乎无法完全正确。 即使在添加后:

conn.cursor().execute("USE WAREHOUSE XS_WAREHOUSE")
conn.cursor().execute("USE DATABASE DB")
conn.cursor().execute("USE SCHEMA db_mg.schemado you")"""



这是我正在使用的当前代码:

import pandas as pd 
from snowflake.sqlalchemy import URL 
from sqlalchemy import create_engine 


"""Extract the list of part numbers from the Part Number column and input it into a pandas 
dataframe"""
df = pd.read_excel(r'C:/Users/[MyUsername]/Downloads/EAS Working Candidates.xlsx') 
part_num_col = df['PartNumber'].tolist() 

"""SQL Query for Parts List built from .XLSX Part File.
Part supersession is done through AS400 manually. The Query loops the part numbers back 
through the query until a null is returned. Once a null is returned, the part number from the 
previous loop is then placed into a column 'final_actual'."""

query = r"SELECT r.itmid, rg.cstsku as final_part, i.item_desc as final_part_desc,  
CASE WHEN rg.cstsku is not null THEN rg.cstsku 
WHEN rf.cstsku is not null THEN rf.cstsku 
WHEN re.cstsku is not null THEN re.cstsku 
WHEN rd.cstsku is not null THEN rd.cstsku 
WHEN rc.cstsku is not null THEN rc.cstsku 
WHEN rb.cstsku is not null THEN rb.cstsku 
WHEN ra.cstsku is not null THEN ra.cstsku 
WHEN r.cstsku is not null THEN r.cstsku 
ELSE r.itmid END as final_actual 
FROM DB.AS400.VC_DOPCIXREF r 
LEFT JOIN DB.AS400.VC_DOPCIXREF ra 
  ON r.cstsku = ra.itmid 
LEFT JOIN DB.AS400.VC_DOPCIXREF rb 
  ON ra.cstsku = rb.itmid 
LEFT JOIN DB.AS400.VC_DOPCIXREF rc 
  ON rb.cstsku = rc.itmid 
LEFT JOIN DB.AS400.VC_DOPCIXREF rd 
  ON rc.cstsku = rd.itmid 
LEFT JOIN DB.AS400.VC_DOPCIXREF re 
  ON rd.cstsku = re.itmid 
LEFT JOIN DB.AS400.VC_DOPCIXREF rf 
  ON re.cstsku = rf.itmid 
LEFT JOIN DB.AS400.VC_DOPCIXREF rg 
  ON rf.cstsku = rg.itmid 
LEFT JOIN DB.AS400.VC_ITEM i 
  ON rg.cstsku = i.item_id WHERE r.cstsku IN (" + "'" + "','".join(map(str, part_num_col)) + "'" + ");"

#Connect to the Snowflake Data Warehouse 
engine = create_engine(URL( 
    user='[MyUsername]@domain.com', 
    account='account', 
    role='ANALYST', 
    authenticator='EXTERNALBROWSER', 
    warehouse='DB', 
    database='AS400', 
)) 
connection = engine.connect() 
cur = connection.cursor() 
try: 
    cur.execute(query) 
    df = pd.read_sql(query, engine) 
finally: 
    connection.close() 
    engine.dispose()

我收到以下错误:

Traceback (most recent call last): 
  File "C:\Users\[MyUsername]\PycharmProjects\PTC EAS Report\PTC EAS Part List.py", line 24, in <br /> <module> 
    cur = Connection.Cursor() 
AttributeError: 'Connection' object has no attribute 'Cursor'



提前感谢您的浏览,(另外,如果我下次能以更好、更易读的方式呈现这个,请告诉我!我还在学习!)

sqlalchemy 雪花连接器中没有与连接 object 关联的 cursor 属性。

正确用法如下

from snowflake.sqlalchemy import URL
from sqlalchemy import create_engine

engine = create_engine(URL(
account = 'myorganization-myaccount',
user = 'testuser1',
password = '0123456',
database = 'testdb',
schema = 'public',
warehouse = 'testwh',
role='myrole',
))
try:
connection = engine.connect()
results = connection.execute('select 
current_version()').fetchone()
print(results[0])

or

rows = r.fetchall()
results = connection.execute('select 
current_version()').fetchall()
print(rows)

finally:
connection.close()
engine.dispose()

问候, 苏扬

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM