You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python+Snowflake Connector查询Excel零件号列表报错排查

问题排查与解决方案

1. 直接错误修复:AttributeError

你遇到的AttributeError: 'Connection' object has no attribute 'Cursor'是因为代码中误将小写的cursor()写成了大写的Cursor()(错误栈里的cur = Connection.Cursor())。SQLAlchemy的Connection对象的游标方法是小写的cursor(),修正这个拼写错误即可解决该报错。

2. 修复后的完整代码(含结果写入Excel)

以下是整合了错误修复、SQL安全优化、Snowflake连接配置及结果写入Excel的完整代码:

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

# 1. 读取Excel中的零件号
df_source = pd.read_excel(r'C:/Users/[MyUsername]/Downloads/EAS Working Candidates.xlsx')
part_num_list = df_source['PartNumber'].astype(str).tolist()

# 2. 编写参数化SQL查询(避免字符串拼接的SQL注入风险)
query = """
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 (%s)
""" % ','.join(['%s'] * len(part_num_list))

# 3. 配置Snowflake连接(直接在URL中指定仓库、数据库、Schema,避免重复执行USE语句)
engine = create_engine(URL(
    user='[MyUsername]@domain.com',
    account='account',
    role='ANALYST',
    authenticator='EXTERNALBROWSER',
    warehouse='XS_WAREHOUSE',  # 替换为正确的仓库名
    database='DB',            # 替换为正确的数据库名
    schema='AS400'            # 替换为正确的Schema名
))

# 4. 执行查询并合并结果到原Excel数据
with engine.connect() as conn:
    # 执行查询(参数化传入零件号列表)
    df_result = pd.read_sql(query, conn, params=part_num_list)

# 5. 将查询结果合并到原数据(按零件号关联)
df_combined = pd.merge(df_source, df_result, left_on='PartNumber', right_on='itmid', how='left')

# 6. 写入新的Excel文件(包含原数据和升级后的零件号列)
df_combined.to_excel(r'C:/Users/[MyUsername]/Downloads/EAS Working Candidates_Updated.xlsx', index=False)

# 释放资源
engine.dispose()

3. 关键优化点说明

  • SQL安全优化:不再使用字符串拼接生成IN子句,改用参数化查询,避免SQL注入风险,同时解决零件号含特殊字符(如单引号)导致的语法错误。
  • 连接配置简化:直接在Snowflake URL中指定warehouse、database、schema,无需手动执行USE语句,减少冗余操作。
  • 资源管理优化:使用with语句自动管理连接生命周期,无需手动调用close()。
  • 结果整合逻辑:通过pd.merge将原Excel数据与查询结果关联,确保每个原零件号对应到升级后的结果。

4. 规范问题呈现建议

下次提问时可按以下结构整理,更便于他人快速定位问题:

  • 核心需求:一句话说明要实现的目标(如:自动化将Excel物料清单零件号升级并写入原文件)。
  • 当前进展:已完成的步骤(如:成功提取Excel零件号、Snowflake认证通过)。
  • 具体报错:完整的错误栈信息(复制粘贴原始内容)。
  • 关键代码片段:仅保留与报错相关的核心代码(如连接部分、查询执行部分),无需全量代码。
  • 尝试过的解决方案:明确列出已尝试的操作(如:添加USE语句)及结果。

内容的提问来源于stack exchange,提问作者CodeMyJobAway22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:15:30