【问题标题】:Working with an Access database in Python on non-Windows platform (Linux or Mac)在非 Windows 平台(Linux 或 Mac)上使用 Python 中的 Access 数据库
【发布时间】:2014-10-25 03:29:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python macos ms-access odbc pyodbc


    【解决方案1】:

    在 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
    

    【讨论】:

    • 我收到错误:[Errno 2] 没有这样的文件或目录:'mdb-schema': 'mdb-schema'
    • 那是因为 pandas_access 只是一个子进程调用包装一个旧的和未维护的 CLI 实用程序:mdbtools。 mdbtools.sourceforge.net 。对现代用途不是很有帮助。
    • Pandas_access + mdbtools 开箱即用!我希望这将在未来保持。我在 pyodbc+unixodbc 上苦苦挣扎,由于缺少驱动程序而不得不放弃。
    • Ubuntu 20.04 和 Python 3.8:完美运行!谢谢
    【解决方案2】:

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

    不正确。主要pyodbc page

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

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

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

    在这两种情况下,您都需要下载最新版本的 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
    

    【讨论】:

    • 您能帮我设置 Jython,我收到错误消息 - 没有名为 com.ziclix.python.sql 的模块。
    • @ShravyaShetty 使用 jython 而不是 'python' 运行它。但它并没有解决我的问题。但是你的错误是因为使用 python 运行。
    • 你将如何使用jackcess-encrypt-2.x.x和这个方法打开一个密码加密的数据库?
    • pip install JPype1==0.6.3 JayDeBeApi==1.1.1 这在我的 Mac 上不起作用。我得到以下错误:#include_next /* 递归到真正的 */ ^ 编译终止。 error: command 'gcc' failed with exit status 1 我什至尝试了以下步骤来修复此错误,但它不起作用stackoverflow.com/questions/54016317/…
    【解决方案3】:

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

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

    【讨论】:

    • 服务不是免费的。有关开源解决方案,请参阅 this answer
    • 你在投反对票之前有没有尝试过?我的小型 MS Access DB 对我来说是完全免费的。可能有一个需要付款的层,但我在尝试自己进行转换时发现了这个问题,而现有的答案都没有让我到达那里,这就是为什么我发布了对我真正有用的东西。我不为这种东西付钱。
    • 我试过了。两次。来自不同的浏览器。我的数据库有 300 行。也许自从您使用以来他们已经更改了定价方案,或者差异可能是由于其他原因引起的。但是当我尝试它时这不是免费的,所以我很难推荐你的答案。我宁愿使用您的解决方案,也不愿浪费时间提出替代方案;很抱歉,它对我不起作用。
    • 你怎么敢为此提出付费解决方案!我宁愿花 6 个小时调试 mdb 安装。大声笑-付费解决方案在 SO 上被低估了。我浪费了很多时间试图让它工作,而 rebasedata 就成功了。 Protip - 如果可以的话,从 Windows 机器访问该站点,否则从 Mac 访问会花费更多(他们不允许您购买 7 天访问权限)
    【解决方案4】:

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

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

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

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

    但是在源代码中查看这部分。

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

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

    【讨论】:

    • 当然可以在非 Windows 机器上安装 pyodbc,但您仍然需要 Access 数据库的 ODBC 驱动程序。这就是困难。
    猜你喜欢
    • 2011-05-20
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    相关资源
    最近更新 更多