在非 Windows 平台(Linux 或 Mac)上使用 Python 访问数据库
- 2025-01-21 09:01:00
- admin 原创
- 84
问题描述:
我想访问 Microsoft Access 数据库中的数据。我有一些 .accdb 和 .mdb 文件,想用 Python 读取它们。
据我研究,pyodbc 只能在 Windows 平台上使用,但我在 Mac OS X 上工作。我是 Python 新手。
另一个选择是,我可以将数据从数据库导出到 csv,然后在 python 中使用。
任何帮助或开始都将非常感激。
解决方案 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
解决方案 2:
“根据我的研究,pyodbc 只能在 Windows 平台上使用”
不对。pyodbc 主页上说
为 Windows 和 macOS 上的大多数 Python 版本提供了预编译的二进制轮子。在其他操作系统上,[pip install pyodbc] 将从源代码构建。
然而,使用 ODBC 操作Access 数据库主要是在 Windows 上进行的,这一点毋庸置疑。“MDB 工具”和“unixODBC”经常被提及作为在非 Windows 平台上操作 Access 数据库的一种方式,但它有其局限性。
当然,您始终可以为非 Windows 平台购买第三方 MS Access ODBC 驱动程序,但如果您想要免费的开源解决方案,则可以使用UCanAccess JDBC 驱动程序。
前往Maven Central 上的 UCanAccess,浏览最新版本,并下载 uber.jar 文件。
使用 JayDeBeApi
您可以使用 安装 JayDeBeApi pip
。
如果您尚未安装 JRE(Java 运行时环境),那么您也需要它。(我sudo apt install default-jre
在 Ubuntu 上使用过。)
一旦所需的组件到位,您就应该能够使用如下代码:
import jaydebeapi
db_path = "/home/gord/test.accdb"
classpath = "/home/gord/Downloads/ucanaccess-5.1.2-uber.jar"
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()
解决方案 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
解决方案 4:
我对 有疑问pandas-access
,这是最佳答案所推荐的。
正如许多其他答案指出的那样,使用 pyodbc 的问题在于,在 macos 上获取 pyodbc 的 mdb 驱动程序并不是非常快捷、简单或便宜。
当然,在线工具要求您上传数据库,其中可能包含您不愿分享的数据。
因此,我最终自己包装了mdbtools,这很简单,如果您在这里找到自己,我决定分享它以防它有用。它需要一个 mdb 文件并导出 csv、excel 或 sqlite,具体取决于您的需求。完整的代码和文档位于此要点中。
我基本上只是包装了以下 3 个命令:
mdb-tables
:mdb-tables -d ", " MDB_FILE
mdb-export
:重要的是,这可以导出 csv(默认),但也可以导出到其他后端,例如通过 -I 导出到 sqlite,例如mdb-export -I sqlite MDB_FILE TABLE_NAME
mdb-schema
:这也可以采用后端(例如 sqlite):mdb-schema --indexes --relations --default-values --not-null MDB_FILE -T TABLE_NAME sqlite
解决方案 5:
这个问题很老了,但文档说:
最简单的安装方法是使用 pip。将下载 Windows 二进制文件,但其他操作系统需要从源代码进行编译。
所以应该是可以的。还有一个针对 Linux 机器的示例。
http://mkleehammer.github.io/pyodbc/#connecting
但请检查源代码中的这部分。
https://github.com/mkleehammer/pyodbc/blob/master/tests2/accesstests.py#L630,L636
它向您展示了 MS Access 文件的连接字符串是什么样的。