使用 pyodbc 连接到链接访问数据库

Posted

技术标签:

【中文标题】使用 pyodbc 连接到链接访问数据库【英文标题】:Connection to Linked Access Database Using pyodbc 【发布时间】:2019-04-10 18:04:02 【问题描述】:

我正在尝试从 Microsoft Access 数据库中获取数据。问题是我受到的限制数量:

    我必须使用 64 位 Python access 数据库由链接到不同数据库的表组成 其他数据库需要 32 位 Oracle 驱动程序

因此,我将 Access 数据库存储在本地,并尝试使用 PyODBC 连接到该数据库。

我试过环顾四周并弄乱连接字符串,但这个问题似乎很独特。

这是我目前的修改版本:

import pyodbc

dbPATH = r'C:\path\to\database.accdb'
UID = 'username'
PWD = 'username'

driver = r'DRIVER=Microsoft Access Driver (*.mdb, *.accdb);'
credentials = r'DBQ=%s;UID=%s;PWD=%s'%(dbPATH, UID, PWD)
conn_str = driver + credentials

connection = pyodbc.connect(conn_str)
cursor = connection.cursor()
cursor.execute("select * from [table_name];")

for row in cursor.fetchone():
    print(row)

这是我通常得到的错误:

pyodbc.Error: ('HY000', "[HY000] [Microsoft][ODBC Microsoft Access Driver] ODBC--connection to 'Oracle in OraClient11g_home1_32bit' failed. (-2001) (SQLExecDirectW)")

这令人惊讶,因为这是访问数据库用来连接到其他数据源的驱动程序和连接。

我试过设置

pyodbc.pooling = False

但这并没有改变任何东西。

【问题讨论】:

this tip 有帮助吗? 这是我看过的东西之一,但即使我关闭池连接,错误消息也不会改变 "这是访问数据库用来连接到其他数据源的驱动程序和连接" - 是的,但是如果您的机器安装了 32 位 Office,那么 MSACCESS.EXE 可以使用 32-位 Oracle 的 ODBC 驱动程序,因为它在 Windows 32 位子系统中运行,而您的 64 位 Python 应用程序无法“看到” 32 位 Oracle 驱动程序。 对,所以理论上设置 ``` pyodbc.pooling = False ``` 应​​该绕过这个问题吧? 不,问题比这更根本。看我的回答。 【参考方案1】:

您有两个互斥的约束:

    我必须使用 64 位 Python

...和...

    其他数据库需要 32 位 Oracle 驱动程序

64 位进程不能使用 32 位 ODBC 驱动程序;它们根本不兼容。如果堆栈的其余部分(Oracle ODBC 驱动程序、Microsoft Office/Access 应用程序)是 32 位的,那么如果您想像以前一样使用链接表,则需要使用 32 位版本的 Python描述。

附加说明:您所说的“其他数据库需要 32 位 Oracle 驱动程序”的说法是可疑的。 Oracle、SQL Server 等客户端-服务器数据库并不特别关心它们是接收来自 32 位客户端还是 64 位客户端的请求。 客户端的细节可能存在差异,但这是由客户端上的 ODBC 驱动程序(和/或 ODBC 驱动程序管理器)来确定的。

【讨论】:

以上是关于使用 pyodbc 连接到链接访问数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 sqlalchemy 和 pyodbc 连接到 SQL Server 2012

无法使用 pyodbc 库连接到 Azure 数据库

如何在 python 中使用 pyodbc 连接到本地优势数据库?

尝试使用pyodbc将python连接到Access数据库时出错[重复]

使用 Pyodbc 连接到具有用户定义函数的 MS Access 文件

pyodbc 连接到 sqlite 数据库