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.

Lerne mehr auf CodeScouts.de