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

use*_*166 13 python macos ms-access odbc pyodbc

我想访问Microsoft Access数据库中的数据.我有一些.accdb和.mdb文件,想要用Python读取它们.

根据我的研究,pyodbc只能在Windows平台上使用,但我在Mac OS X上工作.我是Python的新手.

另一种选择是如果我可以将数据从数据库导出到csv然后在python中使用.

任何帮助或开始将受到高度赞赏.

Vip*_*gan 17

在 Mac OSx 和 Ubuntu 18.04 上,您可以使用pandas_access

从文档:

import pandas_access as mdb

db_filename = 'my_db.mdb'

# Listing the tables.
for tbl in mdb.list_tables(db_filename):
  print(tbl)

# Read a small table.
df = mdb.read_table(db_filename, "MyTable")
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 上,您可能需要运行:

sudo apt install mdbtools
Run Code Online (Sandbox Code Playgroud)

  • 那是因为 pandas_access 只是一个子进程调用包装器,围绕一个旧的和未维护的 CLI 实用程序:mdbtools。http://mdbtools.sourceforge.net/。对现代用途不是很有帮助。 (6认同)
  • 在 OS X 13.2.1 Venture 上,在成功使用 pandas_access 之前需要 `brew install mdbtools`。 (2认同)

Gor*_*son 14

"根据我的研究,pyodbc只能在Windows平台上使用"

不对.主要的pyodbc页面

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

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

当然,您始终可以为非Windows平台购买第三方MS Access ODBC驱动程序,但如果您需要免费的开源解决方案,则可以使用UCanAccess JDBC驱动程序.有两种方法可以实现:JythonJayDeBeApi.

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

ucaFolder.png

(在以下示例中,我将其解压缩到~/Downloads/JDBC/UCanAccess.)

 

选项1:Jython

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

之后......

  • 安装Jython(通过pipUbuntu)和
  • 下载UCanAccess并按上述方法解压缩

我创建了以下名为"dbTest.py"的Jython脚本

pip install JPype1==0.6.3 JayDeBeApi==1.1.1
Run Code Online (Sandbox Code Playgroud)

并使用以下shell脚本运行它

import jaydebeapi

db_path = "/home/gord/test.accdb"

ucanaccess_jars = [
    "/home/gord/Downloads/JDBC/UCanAccess/ucanaccess-4.0.4.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-lang-2.6.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-logging-1.1.3.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/hsqldb.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/jackcess-2.1.11.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()
Run Code Online (Sandbox Code Playgroud)

 

选项2:JayDeBeApi

如果您需要使用Python_3或者更喜欢使用CPython,您可能更喜欢这个选项.你可以安装JayDeBeApi sudo apt install default-jre.如果您还没有安装JRE(Java运行时环境),那么您也需要它.(我sudo apt-get install jython在Ubuntu上使用过.)

一旦所需的组件到位,您应该能够使用如下代码:

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()
Run Code Online (Sandbox Code Playgroud)