0

因此,我尝试使用 Python 和 SqlAlchemy 在 Linux 系统(Ubuntu 20.04 和 CentOs 8)上处理 MsAccess DB 文件。即使使用最简单的查询也无法使用 mdbtools 驱动程序。在我家的 Ubuntu 上,我安装了最新的 sqlalchemy_access、pyodbc、unixodbc。作为驱动程序,我安装了 odbc-mdbtools。

在 /etc/odbcinst.ini 建立正确的连接:

[MDBTools]
Description=MDBTools Driver
Driver=libmdbodbc.so
Setup=libmdbodbc.so
FileUsage=1
UsageCount=1

DSN URI 是:

MAIN_DB_CONNECTION_STRING = (
'DRIVER={MDBTools};'
f'DBQ={os.path.join(BASE_DIR, DB_FILENAME)};'
)

MAIN_DB_CONNECTION_URI = f"access+pyodbc:///?odbc_connect={parse.quote_plus(MAIN_DB_CONNECTION_STRING)}"

我的数据库模型是:

class ChargeArticleMainDB(Base):
    __tablename__ = 'Articles'
    id = Column(Integer, name='id', primary_key=True, autoincrement=True)
    article = Column(String(8), name='article')
    article_ext = Column(String(10), name='article_ext')
    codex_id = Column(Integer, name='codex_id')
    description = Column(String(255), name='description')
    query = main_session.query_property()

所以一切正常,并且在我提出第一个请求之前运行没有错误。如果我尝试简单地从基础获取所有文章,我会收到以下错误:

sqlalchemy.exc.OperationalError: (pyodbc.OperationalError) ('08001', "[08001] Couldn't parse 

SQL\n (1) (SQLExecDirectW)")
[SQL: SELECT [Articles].id AS [Articles_id], [Articles].article AS [Articles_article], [Articles].article_ext AS [Articles_article_ext], [Articles].codex_id AS [Articles_codex_id], [Articles].description AS [Articles_description] 
FROM [Articles]]

如您所见,SQL 语句是正确的,并且在 DBeaver 中运行没有问题。似乎 mdbtools 驱动程序存在一些问题。因此,我试图找到另一个可以在 Linux 下运行的 MsAccess 驱动程序。按照这个旧答案,mdbtools 只有 2 个替代品(JayDeBeApi 和 Jython)。DBeaver 也使用 UCanAccess 驱动程序。它们都依赖于Java VM,由于一些内部问题,无法在目标系统上使用。没有 Java 的 MsAccess 是否有任何已知的驱动程序替代品?

PS 即使我在数据库和模型中只留下一个 ID 列并运行原始请求,也会出现同样的问题:

    query = """SELECT * FROM Articles;"""
    print(session.execute(query))

PPS 如果我使用 isql 实用程序,也会出现同样的问题。工具 mdb-sql 工作正常 - 显示 UTF-8 字符(DB 有俄语)。

4

0 回答 0