如何使用 64 位 python 和 odbc 驱动程序读取 32 位 .mdb

How to read from a 32 bit .mdb with 64 bit python and odbc driver

社区大家好,

我正在寻找 32 位 .mdb 与我的 64 位环境冲突的解决方案:64 位 Windows 7,带有 64 位 MS Access 数据库驱动程序 运行 64 位 python。我想将这些 .mdb 中的数据写入 64 位 PostgreSQL 数据库,也可能写入 .csv 文件。但是,我希望这个工具不仅可以在我的机器上工作,也可以在同事的机器上工作,因此理想情况下它也能够处理其他环境。

最初我使用 32 位版本的 MS Access 数据库驱动程序和 python 编写了一个写入 .csv 的脚本。但是,我想创建一个 QGIS 插件,我也有 64 位的,我不想将所有内容都更改为 32 位,只是为了能够读取偶尔的 32 位 .mdb 文件。

我对编码完全陌生,但我已经阅读了这个问题并理解在 32 位数据库和 64 位脚本和驱动程序之间建立直接连接基本上是不可能的。尽管如此,我还是很难相信这个问题没有解决方案。网络应用程序不经常处理这些情况吗?是否可以使用 Django 来创建这种功能?还是使用声称支持 32 位和 64 位的昂贵驱动程序是一种解决方案?创建一个独立的工具会更容易吗?或者是否已经存在这样的工具,只是我还没有找到?

总结一下:我希望将数据从 32 位 .mdb 写入 64 位 PostgreSQL 数据库,最好在 QGIS 插件中编码。

我之前工作的初始代码是:

import csv, pyodbc
from tkinter import Tk
from tkinter.filedialog import askopenfilename

Tk().withdraw()
filename = askopenfilename()filenameEdit = filename.replace(":/", "://")

print(filename)
print(filenameEdit)

MDB = filename
DRV = '{Microsoft Access Driver (*.mdb, *.accdb)}'
DBQ = filename
PWD = 'pw'

con = pyodbc.connect('DRIVER={};DBQ={};PWD={}'.format(DRV,MDB,PWD))
cur = con.cursor()

SQL = 'SELECT * FROM strips'  # This query would need to be expanded
rows = cur.execute(SQL).fetchall()
cur.close()
con.close()

mytable = input("Save file as: ")

def writeCSV():
    with open((mytable+'.csv'), 'w') as newDB:
        csv_writer = csv.writer(newDB, lineterminator='\n')
        for row in rows:
            csv_writer.writerow(row)

writeCSV()

# Another function should be added to write to a PostreSQL database

现在 运行 64 位的错误是:

con = pyodbc.connect('DRIVER={};DBQ={};PWD={}'.format(DRV,MDB,PWD))

pyodbc.Error: ('HY000', "[HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0x2820 Thread 0x2758 DBC 0x65626f8
Jet'. (63) (SQLDriverConnect); [HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0x2820 Thread 0x2758 DBC 0x65626f8
Jet'. (63); [HY000] [Microsoft][ODBC Microsoft Access Driver] Cannot open a database created with a previous version of your application. (-1019); [HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0x2820 Thread 0x2758 DBC 0x65626f8
Jet'. (63); [HY000] [Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0x2820 Thread 0x2758 DBC 0x65626f8
Jet'. (63); [HY000] [Microsoft][ODBC Microsoft Access Driver] Cannot open a database created with a previous version of your application. (-1019)")`

任何想法将不胜感激, 非常感谢!

A​​ccess 数据库文件(.mdb、.accdb)不是特定于体系结构的;没有“32 位 .mdb 文件”或“64 位 .accdb 文件”之类的东西。 Access 数据库 Engine(和驱动程序等)有 32 位和 64 位版本,但它们生成的数据库文件是相同的。

您正在收到

Cannot open a database created with a previous version of your application.

错误,因为您的 Access 数据库引擎版本不再支持您尝试使用的数据库文件的 版本 (不是 "bitness")。如果您使用 Access_2013 或更高版本的 Access 数据库引擎,则您的文件格式必须为 Access_97 或更早版本。如果您使用来自 Access_2010 的 Access 数据库引擎,那么您尝试使用的文件格式是超旧的(可能是 Access_2.0)。

您似乎已经注意到,我们仍然可以使用 Windows (Microsoft Access Driver (*.mdb)) 附带的遗留 "Jet" 数据库引擎来处理较旧的数据库文件,但它是 32位驱动程序,没有 64 位版本。