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

Python使用pyodbc插入SQL数据仅首行提交报错问题求助

错误根因
  • pyodbc的单个游标同一时间只能维护一个活跃的查询结果集。你代码中查询ticker的结果集没有提前拉取到本地,是边迭代边从游标读取的状态,此时在循环内用同一个游标执行INSERT写入操作,会直接销毁游标上还未读完的SELECT结果,第二次进入循环读取ticker时就会触发无查询结果的报错。
修复方法

方案1(推荐,修改量最小)

提前将所有ticker查询结果一次性加载到本地列表,不再依赖游标持有的结果集,仅修改查询后的赋值行即可:

# 原代码
# tickers = cursor.execute(sql)
# 修改后
tickers = cursor.execute(sql).fetchall()

修改后所有ticker数据已经存在本地内存,后续游标执行INSERT操作不会再影响迭代逻辑。

方案2(读写游标分离)

创建两个独立的游标分别负责查询和写入操作,从根源上避免操作互相干扰:

import yfinance as yf
import pyodbc as py

conn = py.connect('Driver={SQL Server}; Server=ORCHARD; Database=APPLE; Trusted_Connection=yes;')
# 单独创建读游标处理ticker查询
read_cursor = conn.cursor()
sql = 'SELECT ticker FROM tickers'
tickers = read_cursor.execute(sql).fetchall()
# 单独创建写游标处理数据插入
write_cursor = conn.cursor()
insert_sql = 'INSERT INTO share_price VALUES (?, ?, ?)'

for t in tickers:
    ticker = t[0]
    tickerData = yf.Ticker(ticker)
    tickerDf = tickerData.history(period='1d', start='2021-10-21', end='2021-10-21')
    for index, row in tickerDf.iterrows():
        price = row['Open']
        print(ticker, index, price)
        write_cursor.execute(insert_sql, (ticker, index, price))
# 所有写入完成后统一提交,性能更好
conn.commit()
优化提示
  • 插入SQL建议显式指定表字段名,避免后续表结构新增、调整字段顺序时出现插入错位的问题。
  • 批量数据写入时统一在循环结束后提交,比每次循环提交的执行效率高很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:36:04