在非Windows平台(Linux或Mac)上使用Python读取Access数据库

我想访问Microsoft Access数据库中的数据。 我有一些.accdb和.mdb文件,并希望在Python中读取它们。

从我的研究中,pyodbc只能在Windows平台上使用,但是我正在使用Mac OS X.我是Python新手。

另一种select是如果我可以从数据库中导出数据到一个CSV然后在Python中使用。

任何帮助或启动将不胜感激。

“从我的研究,pyodbc只能在Windows平台上使用”

不对。 主要pyodbc页面说

为Windows和MacOS上的大多数Python版本提供了预编译的二进制轮子。 在其他操作系统上[pip install pyodbc]将从源代码构build。

但是,使用ODBC来操作Access数据库肯定是在Windows上完成的。 “MDB Tools”和“unixODBC”经常被提及作为在非Windows平台上使用Access数据库的一种方式,但是在我有限的经验中,我发现它实际上并不是很好(当它工作的时候在所有)。

当然,您可以随时为您的非Windows平台购买第三方MS Access ODBC驱动程序,但是如果您想要免费的开源解决scheme,则可以使用UCanAccess JDBC驱动程序。 有两种方法可以完成: Jython和JayDeBeApi 。

在这两种情况下,您都需要下载最新版本的UCanAccess(可在此处下载),并将“bin.zip”文件解压到方便的位置,确保保留文件夹结构:

ucaFolder.png

(在下面的例子中,我把它解压到~/Downloads/JDBC/UCanAccess 。)

选项1:Jython

重要提示:以下说明适用于UCanAccess版本3.0.5或更高版本。

之后…

  • 安装Jython(通过Ubuntu上的sudo apt-get install jython )和
  • 下载UCanAccess并将其解包,如上所述

我创build了以下名为“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 

选项2:JayDeBeApi

如果您需要使用Python_3或更喜欢使用CPython,则可能更喜欢此选项。 你可以用pip安装JayDeBeApi。 如果你还没有安装JRE(Java Runtime Environment),那么你也需要这个。 (我使用sudo apt install default-jre在Ubuntu上sudo apt install default-jre 。)

一旦所需的组件到位,你应该能够使用这样的代码:

 import jaydebeapi ucanaccess_jars = [ "/home/gord/Downloads/JDBC/UCanAccess/ucanaccess-4.0.2.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-lang-2.6.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-logging-1.1.1.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/hsqldb.jar", "/home/gord/Downloads/JDBC/UCanAccess/lib/jackcess-2.1.6.jar", ] classpath = ":".join(ucanaccess_jars) cnxn = jaydebeapi.connect( "net.ucanaccess.jdbc.UcanaccessDriver", "jdbc:ucanaccess:///home/gord/test.accdb;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() 

这个问题是古老的,但文件说:

最简单的安装方法是使用点。 Windows二进制文件将被下载,但其他操作系统将需要从源代码编译。

所以它应该是可能的。 还有一个linux机器的例子。

http://mkleehammer.github.io/pyodbc/#connecting

但是请查看源代码中的这个部分。

https://github.com/mkleehammer/pyodbc/blob/master/tests2/accesstests.py#L630,L636

它显示了如何MS Access文件的连接string看起来像。