“根据我的研究,pyodbc 只能在 Windows 平台上使用”
不正确。主要pyodbc page说
Windows 和 macOS 上的大多数 Python 版本都提供了预编译的二进制轮子。在其他操作系统上 [pip install pyodbc] 将从源代码构建。
不过,使用 ODBC 操作 Access 数据库 确实主要是在 Windows 上完成的。 “MDB 工具”和“unixODBC”经常被提及作为在非 Windows 平台上使用 Access 数据库的一种方式,但在我有限的经验中,我发现它真的不能很好地工作(当它工作时完全)。
当然,您始终可以为您的非 Windows 平台购买第三方 MS Access ODBC 驱动程序,但如果您想要免费的开源解决方案,您可以使用UCanAccess JDBC 驱动程序。有两种方法可以做到这一点:JayDeBeApi 和 Jython。
在这两种情况下,您都需要下载最新版本的 UCanAccess(可在 here 下载)并将“bin.zip”文件解压到方便的位置,确保保留文件夹结构:
(在以下示例中,我将其解压缩为~/Downloads/JDBC/UCanAccess。)
选项 1:JayDeBeApi
这是首选选项,因为它应该适用于您现有的 Python 设置。您可以使用 pip 安装 JayDeBeApi。
如果您还没有安装 JRE(Java 运行时环境),那么您也需要它。 (我在 Ubuntu 上使用了 sudo apt install default-jre。)
一旦所需的组件到位,您应该能够使用如下代码:
import jaydebeapi
db_path = "/home/gord/test.accdb"
ucanaccess_jars = [
"/home/gord/Downloads/JDBC/UCanAccess/ucanaccess-5.0.0.jar",
"/home/gord/Downloads/JDBC/UCanAccess/lib/commons-lang3-3.8.1.jar",
"/home/gord/Downloads/JDBC/UCanAccess/lib/commons-logging-1.2.jar",
"/home/gord/Downloads/JDBC/UCanAccess/lib/hsqldb-2.5.0.jar",
"/home/gord/Downloads/JDBC/UCanAccess/lib/jackcess-3.0.1.jar",
]
classpath = ":".join(ucanaccess_jars)
cnxn = jaydebeapi.connect(
"net.ucanaccess.jdbc.UcanaccessDriver",
f"jdbc:ucanaccess://{db_path};newDatabaseVersion=V2010",
["", ""],
classpath
)
crsr = cnxn.cursor()
try:
crsr.execute("DROP TABLE table1")
cnxn.commit()
except jaydebeapi.DatabaseError as de:
if "user lacks privilege or object not found: TABLE1" in str(de):
pass
else:
raise
crsr.execute("CREATE TABLE table1 (id COUNTER PRIMARY KEY, fname TEXT(50))")
cnxn.commit()
crsr.execute("INSERT INTO table1 (fname) VALUES ('Gord')")
cnxn.commit()
crsr.execute("SELECT * FROM table1")
for row in crsr.fetchall():
print(row)
crsr.close()
cnxn.close()
选项 2:Jython
(请注意,Jython 是 Python 的单独实现,它仅支持 Python 2.7,并且显然不再处于积极开发中。)
重要提示:以下说明适用于 UCanAccess 3.0.5 或更高版本。
之后……
- 安装 Jython(在 Ubuntu 上通过
sudo apt-get install jython)和
- 如上所述下载UCanAccess并解压
我创建了以下名为“dbTest.py”的 Jython 脚本
from com.ziclix.python.sql import zxJDBC
jdbc_url = "jdbc:ucanaccess:///home/gord/Documents/test.accdb"
username = ""
password = ""
driver_class = "net.ucanaccess.jdbc.UcanloadDriver"
cnxn = zxJDBC.connect(jdbc_url, username, password, driver_class)
crsr = cnxn.cursor()
crsr.execute("SELECT AgentName FROM Agents")
for row in crsr.fetchall():
print row[0]
crsr.close()
cnxn.close()
并使用以下 shell 脚本运行它
#!/bin/bash
export CLASSPATH=.:/home/gord/Downloads/JDBC/UCanAccess/loader/ucanload.jar
jython dbTest.py