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
相关产品推荐
相关产品推荐

