簡體   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