【发布时间】:2015-09-22 13:44:05
【问题描述】:
pypyodbc 如何连接到 .accdb 数据库中的链接表?这是可能的,还是pyodbc的限制?
我需要将数据从 MS Acess .accdb 数据库导入 Python。这非常有效,我可以使用pypyodbc 访问在.accdb 数据库中定义的表和查询。但是,该数据库也有链接到外部 SQL Server 的表。在访问此类链接表时pypyodbc 抱怨它无法连接到 SQL 服务器。
test.accdb 包含两个表:Test(本地表)和cidb_ain(链接 SQL 表)
以下 Python 3 代码是我访问数据的尝试:
import pypyodbc as pyodbc
cnxn = pyodbc.connect(driver='Microsoft Access Driver (*.mdb, *.accdb)',
dbq='test.accdb',
readonly=True)
cursor = cnxn.cursor()
# access to the local table works
for row in cursor.execute("select * from Test"):
print(row)
print('----')
# access to the linked table fails
for row in cursor.execute("select * from cidb_ain"):
print(row)
输出:
(1, 'eins', 1)
(2, 'zwei', 2)
(3, 'drei', 3)
----
Traceback (most recent call last):
File "test_02_accdb.py", line 14, in <module>
for row in cursor.execute("select * from cidb_ain"):
File "C:\software\installed\miniconda3\lib\site-packages\pypyodbc.py", line 1605, in execute
self.execdirect(query_string)
File "C:\software\installed\miniconda3\lib\site-packages\pypyodbc.py", line 1631, in execdirect
check_success(self, ret)
File "C:\software\installed\miniconda3\lib\site-packages\pypyodbc.py", line 986, in check_success
ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
File "C:\software\installed\miniconda3\lib\site-packages\pypyodbc.py", line 964, in ctrl_err
raise Error(state,err_text)
pypyodbc.Error: ('HY000', "[HY000] [Microsoft][ODBC-Treiber für Microsoft Access] ODBC-Verbindung zu 'SQL Server Native Client 11.0SQLHOST' fehlgeschlagen.")
错误消息大致翻译为“与 'SQL Server Native Client 11.0SQLHOST' 的 ODBC 连接失败”。
我无法使用 pypyodbc 通过 .accdb 数据库访问 SQL Server,但可以从 MS Access 中查询 cidb_ain 表。此外,我可以直接连接到 SQL Server:
cnxn = pyodbc.connect(driver='SQL Server Native Client 11.0',
server='SQLHOST',
trusted_connection='yes',
database='stuffdb')
考虑到 (1) MS Access(和 Matlab 也是)可以使用 .accdb 文件中包含的信息来查询链接表,并且 (2) SQL Server 是可访问的,我认为问题与@987654330 有关@。 (错误消息中驱动程序名和主机名被改写为'SQL Server Native Client 11.0SQLHOST' 的方式似乎也有些可疑。)
我以前没有使用 Access 的经验,所以请耐心等待,如果我遗漏了对我来说似乎不必要的重要信息,请告诉我...
【问题讨论】:
-
令我惊讶的是,除了 Access(此处:Matlab)之外的 任何东西 都可以通过 Access 数据库处理链接表。为什么不使用与 SQL Server 的直接连接?
-
access 数据库由其他人维护,并且经常发生更改(外部链接、新查询等)。我想避免更改 Python 代码,例如添加了一个新的外部表。
标签: sql-server ms-access odbc pyodbc pypyodbc