Zugriff auf Access-Datenbank

Da unter Linux die Microsoft-Bibliotheken nicht verfügbar sind, benötigt man für die Verarbeitung von Access-Datenbanken die externe jaydebeapi aus der Bibliothek *UCanAccess*.

Das aktuelle Paket kann bei Sourceforge heruntergeladen werden. Weitere Informationen zur Software findet man auf der UCanAccess-Seite.

Der Inhalt der zip-Datei ist in ein Verzeichnis, z.B. jdbc, zu entpacken. Dieses Verzeichnis muss dann mit dem Skript bzw. Modul ausgeliefert werden, da während der Laufzeit darauf zugegriffen wird. Außerdem muss auf dem System eine Java-Vertsion installiert sein. Eine Verbindung zu einer Access-DB kann damit folgendermaßen im Python-Skript erstellt werden:

    ucanaccess_jars = [
        "./jdbc/UCanAccess/ucanaccess-5.0.1.jar", 
        "./jdbc/UCanAccess/lib/commons-lang3-3.8.1.jar",
        "./jdbc/UCanAccess/lib/commons-logging-1.2.jar",
        "./jdbc/UCanAccess/lib/hsqldb-2.5.0.jar",
        "./jdbc/UCanAccess/lib/jackcess-3.0.1.jar",
    ]

    classpath = ":".join(ucanaccess_jars)

    mdb_connect = jaydebeapi.connect(
        "net.ucanaccess.jdbc.UcanaccessDriver",
        f"jdbc:ucanaccess://<Pfad zur Access-DB>;newDatabaseVersion=V2003",
        ["", ""],
        classpath
    )

Die Einträge der jar-Dateien sind dementsprechend anzupassen, in Abhängigkkeit von der jeweils verwendeten Version. In diesem Beispiel wird UCanaccess 5.0.1 eingesetzt.

Der Parameter „newDatabaseVersion“ ist in Abhängigkeit von der verwendeten Access-Version zu setzen. Ein Anhaltspunkt kann die Dateiendung sein, es gilt z.B.
newDatabaseVersion=V2003 für mdb-Datenbanken
newDatabaseVersion=V2010 für accdb-Datenbanken

Beispiel-Skript ms_access.py

Es wird eine Access-DB mit einer Tabelle table1 erstellt. Es werden Datensätze hinzugefügt, und der Inhalt der Tabelle ausgegeben. Zu Beginnn wird die Tabelle gelöscht, sofern sie bereits vorhanden ist, dadurch kann das Skript wiederholt aufgerufen werden.

import jaydebeapi 

db_path = "test.mdb"

ucanaccess_jars = [
    "jdbc/UCanAccess/ucanaccess-5.0.1.jar",
    "jdbc/UCanAccess/lib/commons-lang3-3.8.1.jar",
    "jdbc/UCanAccess/lib/commons-logging-1.2.jar",
    "jdbc/UCanAccess/lib/hsqldb-2.5.0.jar",
    "jdbc/UCanAccess/lib/jackcess-3.0.1.jar",
]

classpath = ":".join(ucanaccess_jars)

db_connection = jaydebeapi.connect(
    "net.ucanaccess.jdbc.UcanaccessDriver",
    f"jdbc:ucanaccess://{db_path};newDatabaseVersion=V2003",
    ["", ""],
    classpath
)

db_cursor = db_connection.cursor()

# zuerst die alte Tabelle löschen, falls bereits vorhanden
try:
    db_cursor.execute("DROP TABLE table1")
    db_connection.commit()
except jaydebeapi.DatabaseError as ex:
    if "user lacks privilege or object not found: TABLE1" in str(ex):
        pass
    else:
        raise

# Tabelle anlegen
db_cursor.execute("CREATE TABLE table1 (id COUNTER PRIMARY KEY, fname TEXT)")
db_connection.commit()

# Tabelle mit Daten füllen
name_list = ["Anton Meier", "Maria Weber", "Hans Müller", "Anna Schmidt"]

for name in name_list:
    db_cursor.execute(f"INSERT INTO table1 (fname) VALUES '{name}'")

db_connection.commit()

# Inhalt der Tabelle lesen
db_cursor.execute("SELECT * FROM table1")

for row in db_cursor.fetchall():
    print(row)

db_cursor.close() 
db_connection.close()

Beispiel-Ausgabe:

(1, ‚Anton Meier‘)

(2, ‚Maria Weber‘)
(3, ‚Hans Müller‘) 
(4, ‚Anna Schmidt‘)