[英]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.