【发布时间】:2018-07-10 09:44:18
【问题描述】:
大家好,
我正在寻找 32 位 .mdb 与我的 64 位环境冲突的解决方案:64 位 Windows 7,带有运行 64 位 python 的 64 位 MS Access 数据库驱动程序。我想将这些 .mdb 中的数据写入 64 位 PostgreSQL 数据库,也可能写入 .csv 文件。但是,我希望这个工具不仅可以在我的机器上工作,而且还可以在同事的机器上工作,因此理想情况下它也能够处理其他环境。
最初,我有一个使用 32 位版本的 MS Access 数据库驱动程序和 python 写入 .csv 的脚本。但是,我想创建一个 QGIS 插件,我也有 64 位,我不想为了能够读取偶尔的 32 位 .mdb 文件而将所有内容都更改为 32 位。
我对编码完全陌生,但我已经阅读了这个问题并了解在 32 位数据库和 64 位脚本和驱动程序之间建立直接连接基本上是不可能的。尽管如此,我仍然很难相信这个问题没有解决方案。 Web 应用程序不经常处理这些情况吗?例如,是否可以使用 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)")`
任何想法将不胜感激, 非常感谢!
【问题讨论】:
-
mdb 不是 32 位或 64 位的。它们只是文件。但是,您确实需要适当的驱动程序,并且在同一台机器上安装 32 位和 64 位驱动程序往往会导致问题。尝试从通过 64 位 ODBC 数据源管理员创建 DSN 开始,这样更容易排除故障。
-
您好,Erik,非常感谢您的快速回复。 ODBC 数据源管理员中的用户 DSN 是“MS Access 数据库”。驱动程序:Microsoft Access 驱动程序(*.mdb、*.accdb)。我尝试将完整目录输入到 mdb 文件中,但我得到了同样的错误。 mdb 文件的名称会定期更改,用户应该能够在不同的机器上使用该工具。我已尝试指定用户 DSN,但收到此错误:
-
con = pyodbc.connect('DSN = MS Access Database') pyodbc.InterfaceError: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no指定的默认驱动程序 (0) (SQLDriverConnect)')
-
@HCPieck 尝试指定文件名:
con = pyodbc.connect('DSN=MS Access Database;DBQ={}'.format(DBQ))。 -
感谢 Parfait,但仍然是同样的问题:未找到 DSN 且未指定默认驱动程序..
标签: python postgresql csv ms-access 32bit-64bit