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

时间:2018-01-31 10:09:23

标签: python postgresql csv ms-access 32bit-64bit

再次欢迎社区,

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

最初我有一个脚本写入.csv与32位版本的MS Access数据库驱动程序和python。但是,我想创建一个Q64插件,我也有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)")`

非常感谢任何想法, 非常感谢!

1 个答案:

答案 0 :(得分:0)

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

您正在收到

无法打开使用先前版本的应用程序创建的数据库。

错误,因为您的Access数据库引擎版本不再支持您要使用的数据库文件的版本(不是“位”)。如果您将Access数据库引擎用于Access_2013或更高版本,则文件格式必须为Access_97或更低版​​本。如果您使用的是Access_2010中的Access数据库引擎,则您尝试使用的文件的格式是超旧的(可能是Access_2.0)。

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