python(pyodbc):从python结果运行ms访问查询到大小错误

时间:2017-02-11 13:15:38

标签: python ms-access-2010 pyodbc

我在python 3.5上使用pyodbc和pandas,以便将来自MS Access 2010的~10000行数据加载到数据框中,然后计算一些相关性。

当我尝试使用下面的代码来查看生成器的功能时,代码打印出大约9600个预期的行~10000,然后我得到了波纹管错误:

  

[Microsoft] [ODBC Microsoft Access Driver]查询不能   完成。查询的大小都大于最大值   数据库的大小(2 GB),或者没有足够的临时存储空间   磁盘上用于存储查询结果的空间。

**Code:**

Import pyodbc
import pandas as pd

con = pyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
                     r'DBQ=MyDB.mdb;')
cur - con.cursor()
sql = "SELECT * from [query table]" # I have a query table which is pivoting the data inside the access.

def gen(cursor, sql):
   cursor.execute(sql)
   While True:
       row = cursor.fetchone()
       if row is None:
           break
       yield row

for x in gen(cur,sql):
    print(x)

我已经定义了另一个函数,它获取生成器的行并将它们附加到列表然后附加到pd.Dataframe,但似乎生成器没有完成作业。

我压缩并修复了数据库,但没有运气。此外,mdb文件的大小目前不超过500mb。

您能否告诉我如何克服此错误?

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

建立连接时,pyodbc默认为autocommit=False,符合Python的DB-API规范。因此,当执行第一个SQL语句时,ODBC开始一个数据库事务,该事务保持有效,直到Python代码在连接上执行.commit().rollback()

显然,当您处理结果集中的行时,Access数据库引擎正在积累越来越多关于"事务"的信息,最终导致内存不足错误。将pyodbc连接设置为autocommit=True告诉Access数据库引擎不要忘记跟踪任何与事务相关的信息,从而避免错误。