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

私のDBモデルは次のとおりです。

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 (JayDeBeApi と Jython) には 2 つの選択肢しかありませんでした。また、DBeaver は UCanAccess ドライバーを使用します。これらはすべて Java VM に依存しており、内部の問題によりターゲット システムでは使用できません。Java を使用しない MsAccess の既知の代替ドライバーはありますか?

PS DB とモデルに ID 列を 1 つだけ残して raw リクエストを実行しても、同じ問題が発生します。

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

PPS isqlユーティリティを使用すると同じ問題が発生します。ツール mdb-sql は正常に動作します - UTF-8 文字を表示します (DB にはロシア語があります)。

4

0 に答える 0