MS Access可执行查询但pyodbc报错超2GB上限问题求助
问题原因与解决办法
核心原因
- Access内部执行查询时采用按需流式加载结果,不会一次性把所有结果写入临时文件或加载到内存;但pyodbc调用ODBC驱动时,默认会尝试将整个查询结果一次性拉取到客户端,当结果集的实际体积(非原始数据库大小)接近/超过2GB时,就会触发错误提示。
- 临时文件存储路径不一致:Access自身使用的临时文件路径和ODBC驱动的默认临时路径(通常是系统盘的
C:\Windows\Temp)不同,若系统盘剩余空间不足,哪怕本地其他磁盘有空间也会报错。 - 你设置的
autocommit=True未生效:代码里只是单独定义了变量,没有传入connect方法的参数中,等于没起作用。
解决办法
- 分批次读取结果:不要一次性加载全部数据,用
fetchmany()每次读取固定行数,处理后再取下一批,示例代码:import pyodbc conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\Desktop\filename.accdb;', autocommit=True) cursor = conn.cursor() sql = "{CALL QUERY_NAME}" cursor.execute(sql) # 每次读取1000行,可根据内存调整 batch_size = 1000 while True: rows = cursor.fetchmany(batch_size) if not rows: break # 这里处理读取到的行数据,比如写入文件、分析等 for row in rows: print(row) - 修正autocommit参数:将
autocommit=True直接传入connect方法,如上面代码所示,这能减少临时文件的生成量。 - 检查并调整临时目录:
- 打开运行窗口(Win+R)输入
%TEMP%,查看该目录所在分区的剩余空间,确保足够; - 若系统盘空间不足,可通过ODBC数据源管理器修改Access驱动的临时文件路径到空间充足的分区。
- 打开运行窗口(Win+R)输入
- 优化查询逻辑:如果结果集确实过大,在Access里修改原查询,添加过滤条件(比如时间范围、特定字段筛选)减少返回数据,或拆分查询为多个小任务分步执行。
内容的提问来源于stack exchange,提问作者felipetravi
相关产品推荐
相关产品推荐

