web-dev-qa-db-ja.com

Windows以外のプラットフォーム(LinuxまたはMac)でPython)でAccessデータベースを操作する

MicrosoftAccessデータベースのデータにアクセスしたい。 .accdbファイルと.mdbファイルがいくつかあり、Pythonでそれらを読みたいと思っています。

私の調査によると、pyodbcはWindowsプラットフォームでのみ使用できますが、Mac OSXで作業しています。Pythonは初めてです。

もう1つのオプションは、データベースからcsvにデータをエクスポートしてからPythonで使用できるかどうかです。

どんな助けや開始も大歓迎です。

15
user2948166

「私の調査によると、pyodbcはWindowsプラットフォームでのみ使用できます」

違います。メイン pyodbcページ は言う

プリコンパイルされたバイナリホイールは、WindowsおよびmacOSのほとんどのPythonバージョンで提供されています。他のオペレーティングシステムでは、[pip installpyodbc]はソースからビルドされます。

ただし、ODBCを使用してAccessデータベースを操作することは主にWindowsで行われることは確かです。 "MDBツール「」は、「unixODBC」とともに、Windows以外のプラットフォームでAccessデータベースを操作する方法としてよく言及されますが、私の限られた経験では、実際にはうまく機能しないことがわかりました(まったく機能しない場合)。 。

もちろん、Windows以外のプラットフォーム用にサードパーティのMS Access ODBCドライバーをいつでも購入できますが、無料のオープンソースソリューションが必要な場合は、 CanAccess JDBCドライバー。これを実現するには、 JayDeBeApiJython の2つの方法があります。

どちらの場合も、UCanAccessの最新バージョン(ダウンロード可能 ここ )をダウンロードし、「bin.Zip」ファイルを便利な場所に解凍して、フォルダー構造を保持する必要があります。

ucaFolder.png

(次の例では、~/Downloads/JDBC/UCanAccessに解凍しました。)

オプション1:JayDeBeApi

これは、既存のPythonセットアップで機能するはずなので推奨されるオプションです。JayDeBeApiはpipでインストールできます。現在(2019年7月)JPype1の新しいバージョンで問題が発生しているため、特定のバージョンをインストールする必要があります

pip install JPype1==0.6.3 JayDeBeApi==1.1.1

JRE(Javaランタイム環境)がまだインストールされていない場合は、それも必要になります。 (私はUbuntuでSudo apt install default-jreを使用しました。)

必要なコンポーネントが配置されると、次のようなコードを使用できるようになります。

import jaydebeapi

db_path = "/home/gord/test.accdb"

ucanaccess_jars = [
    "/home/gord/Downloads/JDBC/UCanAccess/ucanaccess-4.0.4.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-lang-2.6.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/commons-logging-1.1.3.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/hsqldb.jar",
    "/home/gord/Downloads/JDBC/UCanAccess/lib/jackcess-2.1.11.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()

次のシェルスクリプトで実行しました

#!/bin/bash
export CLASSPATH=.:/home/gord/Downloads/JDBC/UCanAccess/loader/ucanload.jar
jython dbTest.py
15
Gord Thompson

MacOSxおよびUbuntu18.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

この質問は古いですが、ドキュメントには次のように書かれています。

インストールする最も簡単な方法は、pipを使用することです。 Windowsバイナリはダウンロードされますが、他のオペレーティングシステムはソースからコンパイルする必要があります。

だからそれは可能であるはずです。 Linuxマシンの例もあります。

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

しかし、ソースのこの部分をチェックしてください。

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

これは、MSAccessファイルの接続文字列がどのように見えるかを示しています。

0
gravmatt