Florian Herlings, freier Webentwickler aus Düsseldorf.

Access-Datenbanken mit Python manipulieren

In einem Kundenprojekt ergab sich die Anforderung, Daten einer bestehenden Access-Datenbank in ein anderes System zu synchronisieren. Das Problem interessierte mich, ich hatte jedoch kein gesteigertes Interesse daran, ein .NET-Programm zu schreiben (obwohl C# eine interessante Sprache ist).

Nach kurzer Recherche ergab sich, dass es problemlos möglich ist, Daten aus einer Access-Datenbank zu lesen, da man "normale" SQL-Statements auf der Datenbank ausführen kann. Noch glücklicher machte mich die Erkenntnis, dass es einen Adapter für die Programmiersprache Python gibt, welcher mit der Windows-Version von Python ausgeliefert wird.

Zur Demonstration habe ich eine einfache Access-Datenbank angelegt, welche über eine Tabelle mit dem Namen "personen" verfügt und so aussieht:

Der Zugriff auf die Access-Datenbank lässt sich in einer einfachen Klasse kapseln:

import win32com.client
from pprint import pprint
 
class AccessDB(object):
 
  def __init__(self, filename):
    """ Constructor. Provide the filename of the access database
        as a parameter (typically *.mdb). """
    self._connection = win32com.client.Dispatch(r'ADODB.Connection')
    self._connection.Open("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=%s;" % filename)
 
  def query(self, sql):
    """ Runs the provided query against the database and returns
        the result as a recordset. """
    recordset = win32com.client.Dispatch(r'ADODB.Recordset')
    recordset.Open(sql, self._connection ,1 ,3)
    return recordset
 
  def fetch_all(self,sql):
    """ Runs the query against the database and fetches all results.
        The methods will return an array of dicts, containing the
        result's content. """
    results = []
    recordset = self.query(sql)
    while not recordset.EOF:
      single_result = {}
      for field in recordset.Fields:
        single_result[str(field.name.encode("utf-8"))] = field.Value
      results.append(single_result)
      recordset.MoveNext()
    return results
 
if __name__ == '__main__':
  access_db = AccessDB('test.mdb')
  people = access_db.fetch_all("SELECT * FROM `personen`")
  pprint(people)

Ruft man nun oben angegebenes Skript auf, erhält man den vollständigen Inhalt der Tabelle "personen". Die Daten liegen in diesem Moment in Python vor und können nach Belieben weiterverarbeitet werden.