如何使用 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)")`
任何想法将不胜感激,
非常感谢!
Access 数据库文件(.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 位版本。
社区大家好,
我正在寻找 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)")`
任何想法将不胜感激, 非常感谢!
Access 数据库文件(.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 位版本。