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

问题描述 投票:0回答:4

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

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

另一个选择是我是否可以将数据从数据库导出到 csv,然后在 python 中使用。

任何帮助或开始将不胜感激。

python macos ms-access odbc pyodbc
4个回答
26
投票

在 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")

在 Ubuntu 上您可能需要运行:

sudo apt install mdbtools

22
投票

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

不正确。 pyodbc 主页

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

但是,使用 ODBC 操作 Access 数据库 确实主要是在 Windows 上完成的。 “MDB 工具”和“unixODBC”经常被提及作为在非 Windows 平台上使用 Access 数据库的一种方式,但根据我有限的经验,我发现它确实不能很好地工作(当它工作时)根本)。

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

在这两种情况下,您都需要下载最新版本的 UCanAccess(可在此处下载)并将“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"
## check your jar file version numbers
ucanaccess_jars = [
    "/home/gord/Downloads/JDBC/UCanAccess/ucanaccess-5.0.1.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

0
投票

对于将旧的 .mdb 文件一次性转换为 .sqlite,我发现这个网站很有帮助:https://www.rebasedata.com/convert-mdb-to-sqlite-online。我与它没有任何关系,这只是当这里没有答案对我有用时我所得到的结果。他们提供了一个curl命令:

curl -F files[][email protected] 'https://www.rebasedata.com/api/v1/convert?outputFormat=sqlite&errorResponse=zip' -o output.zip


-1
投票

这个问题很旧,但文档说:

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

所以应该是可以的。还有一个针对 Linux 机器的示例。

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

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

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

它向您展示了 MS Access 文件的连接字符串的样子。

© www.soinside.com 2019 - 2024. All rights reserved.