{"id":171573,"date":"2026-01-28T12:23:16","date_gmt":"2026-01-28T11:23:16","guid":{"rendered":"https:\/\/liora.io\/de\/?p=171573"},"modified":"2026-02-06T04:44:10","modified_gmt":"2026-02-06T03:44:10","slug":"api-mit-python-datenbank-verbinden","status":"publish","type":"post","link":"https:\/\/liora.io\/de\/api-mit-python-datenbank-verbinden","title":{"rendered":"API mit Python-Datenbank verbinden"},"content":{"rendered":"<p>In einem vorherigen Artikel haben wir einige Prinzipien f\u00fcr den Aufbau von <strong>REST-APIs<\/strong> und ein erstes Beispiel f\u00fcr deren Implementierung unter Python mit Flask gesehen.<br \/>\nIn diesem Beispiel wurden die Daten in Form einer Liste von <strong>W\u00f6rterb\u00fcchern in den Code eingebunden.<\/strong><br \/>\nWir haben auch einen Artikel dar\u00fcber, wie man eine API mit Python, Flask, Swagger und Connection programmiert und dokumentiert.<br \/>\nIm folgenden Beispiel sehen wir uns an, wie man eine <strong>API mit einer externen relationalen Datenbank<\/strong> verbindet und das Filtern von Items nach verschiedenen Bedingungen zul\u00e4sst:<\/p>\n<style>\nbody.elementor-page .elementor-widget-menu-anchor{margin-bottom:0}<\/style>\n<style>\n.elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-heading .elementor-heading-title[class*=elementor-size-]>a{color:inherit;font-size:inherit;line-height:inherit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-medium{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading .elementor-heading-title.elementor-size-xxl{font-size:59px}<\/style>\n<h2 class=\"wp-block-heading\" id=\"h-1-relationale-datenbanken\">1. Relationale Datenbanken<\/h2>\n<p><em><strong>In relationalen Datenbanken k\u00f6nnen Daten gespeichert und abgerufen werden, wobei die Daten in Form von Tabellen gespeichert werden.<\/strong><\/em><\/p>\n<p>Tabellen sind \u00e4hnlich wie Arbeitsbl\u00e4tter: Sie haben Zeilen und Spalten, wobei die Spalten angeben, worauf sich die Daten beziehen, z. B. auf einen Titel oder ein Datum. Die Zeilen repr\u00e4sentieren einzelne Daten, die Nutzern, Transaktionen oder anderen Arten von Einheiten entsprechen k\u00f6nnen.<\/p>\n<h2 class=\"wp-block-heading\" id=\"h-2-sqlite\">2. SQLite<\/h2>\n<p>Die in der Suite verwendete Datenbank-Engine ist SQLite, eine sehr schlanke Datenbank-Engine, die standardm\u00e4\u00dfig unter Python verf\u00fcgbar ist.<\/p>\n<p>Die Standard-Dateierweiterung von SQLite ist <strong>.db<\/strong>.<\/p>\n<p>Die verwendete Datenbank ist die <a href=\"https:\/\/www.sqlitetutorial.net\/sqlite-sample-database\/\">Chinook<\/a>-Datenbank (verf\u00fcgbar \u00fcber den <a href=\"https:\/\/www.sqlitetutorial.net\/app\/uploads\/2018\/03\/chinook.zip\">N\u00e4chster Link<\/a>), die aus 11 Tabellen besteht. Im Folgenden werden wir uns besonders f\u00fcr die <strong>Tabelle employees<\/strong> interessieren: Diese enth\u00e4lt Daten \u00fcber die Angestellten der Firma Chinook, wie z. B. die ID, den Namen, den Vornamen etc.<\/p>\n<h2 class=\"wp-block-heading\" id=\"h-3-eine-api-mit-der-chinook-datenbank-verbinden\">3. Eine API mit der Chinook-Datenbank verbinden<\/h2>\n<p>Wir beginnen damit, die <strong>Datenbank chinook.db in unser Api-Verzeichnis<\/strong> zu kopieren.<\/p>\n<p>Unsere API wird diese Datenbank abfragen, um die gew\u00fcnschten Ergebnisse an die Benutzer zur\u00fcckzugeben.<\/p>\n<p>Der entsprechende Code lautet wie folgt:<\/p>\n<p>Du speicherst sie im Verzeichnis <strong>api<\/strong> unter dem Namen <strong>api4.py<\/strong>.<\/p>\n<p>Um es auszuf\u00fchren, starte ein Kommandozeilenfenster aus dem Verzeichnis <strong>api<\/strong> und gib folgende Befehle ein:<\/p>\n<p style=\"padding-left: 40px;\"><strong>$ export FLASK_APP = api4.py<\/strong><\/p>\n<p style=\"padding-left: 40px;\"><strong>$ export FLASK_ENV = development<\/strong><\/p>\n<p style=\"padding-left: 40px;\"><strong>$ flask run<\/strong><\/p>\n<p style=\"padding-left: 40px;\">(um die Ausf\u00fchrung zu stoppen, dr\u00fccke Strg-C).<\/p>\n<p>Du erh\u00e4ltst unter anderem folgende Meldungen:<\/p>\n<p style=\"padding-left: 40px;\"><strong>* Running on http:\/\/127.0.0.1:5000\/ (Press CTRL+C to quit)<\/strong><\/p>\n<p style=\"padding-left: 40px;\">Nachdem das Programm ausgef\u00fchrt wurde, kannst du Anfragen wie diese an den verwendeten Browser stellen:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><a href=\"http:\/\/127.0.0.1:5000\/api\/v1\/resources\/employees\/all\">http:\/\/127.0.0.1:5000\/api\/v1\/resources\/employees\/all<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><a href=\"http:\/\/127.0.0.1:5000\/api\/v1\/resources\/employees?LastName=Edwards\">http:\/\/127.0.0.1:5000\/api\/v1\/resources\/employees?LastName=Edwards<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><a href=\"http:\/\/127.0.0.1:5000\/api\/v1\/resources\/employees?LastName=Edwards&amp;City=Calgary\">http:\/\/127.0.0.1:5000\/api\/v1\/resources\/employees?LastName=Edwards&amp;City=Calgary<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><a href=\"http:\/\/127.0.0.1:5000\/api\/v1\/resources\/employees?City=Calgary\">http:\/\/127.0.0.1:5000\/api\/v1\/resources\/employees?City=Calgary<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Die Tabelle <strong>Arbeitnehmer<\/strong> in der Datenbank <strong>Chinook<\/strong> hat 8 Datens\u00e4tze, einen f\u00fcr jeden Arbeitnehmer der Firma Chinook.<\/p>\n<p>Die Daten umfassen unter anderem die <strong>ID, den Vornamen, den Nachnamen, den Wohnort,<\/strong> das Geburtsdatum und das Einstellungsdatum.<\/p>\n<p>Unsere API erm\u00f6glicht es, nach drei Feldern zu filtern: EmployeeId (Benutzerkennung), LastName (Nachname) und City (Wohnort).<\/p>\n<p>Die neue API beantwortet Nutzeranfragen, indem sie die Informationen mithilfe von SQL-Abfragen aus der Datenbank extrahiert.<\/p>\n<p>Sie erm\u00f6glicht es auch, nach mehr als einem Feld zu filtern.<\/p>\n<h2 class=\"wp-block-heading\" id=\"h-4-die-neue-api-verstehen\">4. Die neue API verstehen<\/h2>\n<p>4. Die Tabelle <strong>Arbeitnehmer<\/strong> in der Chinook-Datenbank besteht aus acht Spalten: EmployeeId, LastName, FirstName, Title, ReportsTo, BirthDate, HireDate und Address.<\/p>\n<p>Jede Zeile steht f\u00fcr einen Mitarbeiter der Firma Chinook.<\/p>\n<p>Anstatt die Daten im Code anzugeben, ruft unsere Funktion <strong>api_all<\/strong> sie aus der Chinook-Datenbank ab:neue API<\/p>\n<p>Wir beginnen mit der Datenbankverbindung \u00fcber die Bibliothek <b>sqlite3<\/b>.<\/p>\n<p>Ein Objekt, das die Datenbankverbindung darstellt, wird mit der Variablen <b>conn<\/b>. verkn\u00fcpft.<\/p>\n<p>Die Anweisung <b>conn. row_factory = dict_factory<\/b> sagt dem Objekt, das der Verbindung entspricht, die Funktion <b>dict_factory<\/b> zu verwenden, die Ergebnisse in Form von W\u00f6rterb\u00fcchern statt Listen zur\u00fcckgibt &#8211; was sich besser in JSON umwandeln l\u00e4sst.<\/p>\n<p>Als N\u00e4chstes erstellen wir ein Cursor-Objekt (<b>cur = conn.cursor( )<\/b>), das die Datenbank durchsucht, um die Daten zu extrahieren.<\/p>\n<p>Endlich f\u00fchren wir eine SQL-Abfrage mit der Methode <b>cur.execute<\/b> aus, um alle verf\u00fcgbaren Daten ( * ) aus der Tabelle <b>employees<\/b>unserer Datenbank zu extrahieren..<\/p>\n<p>Am Ende unserer Funktion werden die abgerufenen Daten in das JSON-Format umgewandelt: <b>jsonify(all_employees)<\/b>..<\/p>\n<p>Die andere Funktion, die Daten zur\u00fcckgibt, <b>api_filter<\/b>, verwendet denselben Ansatz, um bestimmte Daten aus der Datenbank zu extrahieren..<\/p>\n<p>Der Zweck der Funktion <b>page_not_found<\/b> ist es, eine Fehlerseite zu erstellen, die dem Benutzer angezeigt wird, wenn er eine Route angibt, die nicht von der API unterst\u00fctzt wird:.<\/p>\n<p>In HTML-Ergebnissen bedeutet der Code 200 &#8222;OK&#8220; (Daten \u00fcbertragen), w\u00e4hrend der Code 404 &#8222;not found&#8220; (keine Ressourcen unter der angegebenen Adresse verf\u00fcgbar) bedeutet.<\/p>\n<p>Die Funktion <b>page_not_found<\/b> gibt 404 zur\u00fcck, wenn etwas schief l\u00e4uft..<\/p>\n<p><b>api_filter<\/b> Die Funktion <b>api_filter<\/b> erlaubt es, nach drei Feldern zu filtern: <b>EmployeeId<\/b>, <b>LastName<\/b> und <b>City<\/b>. .<\/p>\n<p>Er identifiziert zun\u00e4chst alle Anfrageparameter, die in der URL angegeben sind, mithilfe der folgenden Anweisung:.<\/p>\n<p><strong>query_parameters = request.args<\/strong>.<\/p>\n<p>Sie ruft dann die Werte der Parameter ab und verkn\u00fcpft sie mit Variablen:.<\/p>\n<p><strong>employeeid = query_parameters.get(&#8218;EmployeeId&#8216;)<\/strong>.<\/p>\n<p><strong>lastname = query_parameters.get(&#8218;LastName&#8216;)<\/strong>.<\/p>\n<p><strong>city = query_parameters.get(&#8218;City&#8216;)<\/strong>.<\/p>\n<p>Der folgende Codeabschnitt erstellt eine SQL-Abfrage, die verwendet wird, um die gesuchten Informationen aus der Datenbank zu extrahieren..<\/p>\n<p>Die einfachsten SQL-Abfragen haben die folgende Form:.<\/p>\n<p><strong>SELECT &lt;columns&gt; FROM &lt;table&gt; WHERE &lt;column=match&gt; AND &lt;column=match&gt;;<\/strong>.<\/p>\n<p>Um die gesuchten Daten zu erhalten, m\u00fcssen wir sowohl eine SQL-Abfrage der oben genannten Art als auch eine Liste mit den angegebenen Filtern (Werten) erstellen..<\/p>\n<p>Wir beginnen mit der Definition der Abfrage und der Filterliste:.<\/p>\n<p>Wenn <b>EmployeeId<\/b>, <b>LastName<\/b> und <b>City<\/b> als Abfrageparameter \u00fcbergeben wurden, werden sie zur Abfrage und Filterliste hinzugef\u00fcgt:<\/p>\n<p>Wenn der Nutzer keinen dieser Anfrageparameter angegeben hat, wird die Fehlerseite 404 zur\u00fcckgegeben:<\/p>\n<p>Um unsere SQL-Abfrage zu vervollst\u00e4ndigen, entfernen wir das letzte AND und vervollst\u00e4ndigen die Abfrage mit dem von SQL geforderten Semikolon:<\/p>\n<p>Schlie\u00dflich geben wir die Ergebnisse im JSON-Format an den Benutzer zur\u00fcck:.<br \/>\n<strong>R\u00fcckgabe jsonify(Ergebnisse)<\/strong>.<\/p>\n<h2 class=\"wp-block-heading\" id=\"h-5-die-neue-api-verwenden\">5. Die neue API verwenden<\/h2>\n<p>Unsere neue API erm\u00f6glicht anspruchsvollere Abfragen durch die Benutzer.<\/p>\n<p>Au\u00dferdem stehen neue Daten, die der Datenbank hinzugef\u00fcgt werden, sofort f\u00fcr Projekte zur Verf\u00fcgung, die mithilfe der <strong>API erstellt wurden.<\/strong><\/p>\n<p>Daher ist es in vielen F\u00e4llen sinnvoll, zun\u00e4chst eine API-Schnittstelle f\u00fcr Projektdaten zu erstellen, bevor man eine Visualisierung, Anwendung oder Website auf der Grundlage der Daten baut.<\/p>\n<p>Im n\u00e4chsten Artikel werden wir die zuvor vorgestellten Techniken weiterentwickeln, um zu sehen, wie man eine professionelle REST-API unter Python mithilfe von <a href=\"https:\/\/flask.palletsprojects.com\/en\/2.0.x\/\">Flask<\/a>, <a href=\"\/\">OpenAPI<\/a> (ehemals Swagger) und <a href=\"https:\/\/connexion.readthedocs.io\/en\/latest\/#\">Connexion<\/a> programmieren kann.<\/p>\n<h2 class=\"wp-block-heading\" id=\"h-6-bibliografische-referenzen\">6. Bibliografische Referenzen<\/h2>\n<ul>\n<li><em>Creating Web APIs with Python and Flask, Patrick Smyth : <a href=\"https:\/\/programminghistorian.org\/en\/lessons\/creating-apis-with-python-and-flask\">https:\/\/programminghistorian.org\/en\/lessons\/creating-apis-with-python-and-flask<\/a>.<\/em><\/li>\n<li><em>Flask RESTful documentation : <a href=\"https:\/\/flask-restful.readthedocs.io\/en\/latest\/index.html\">https:\/\/flask-restful.readthedocs.io\/en\/latest\/index.html<\/a>.<\/em><\/li>\n<li><em>Flask Web Development : Developing Web Applications with Python (2\u00e8me \u00e9dition). M. Grinberg. O\u2019Reilly 2018.<\/em><\/li>\n<li><em>Architectural Styles and the Design of Network-Based Software Architectures. T. Fielding. Th\u00e8se, Universit\u00e9 de Californie, 2000.<\/em><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In einem vorherigen Artikel haben wir einige Prinzipien f\u00fcr den Aufbau von REST-APIs und ein erstes Beispiel f\u00fcr deren Implementierung unter Python mit Flask gesehen. In diesem Beispiel wurden die Daten in Form einer Liste von W\u00f6rterb\u00fcchern in den Code eingebunden. Wir haben auch einen Artikel dar\u00fcber, wie man eine API mit Python, Flask, Swagger und Connection programmiert und dokumentiert. Im folgenden Beispiel sehen wir uns an, wie man eine API mit einer externen relationalen Datenbank verbindet und das Filtern von Items nach verschiedenen Bedingungen zul\u00e4sst:<\/p>\n","protected":false},"author":47,"featured_media":171575,"comment_status":"open","ping_status":"open","sticky":false,"template":"elementor_theme","format":"standard","meta":{"_acf_changed":false,"editor_notices":[],"footnotes":""},"categories":[2476],"class_list":["post-171573","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloud-dev"],"acf":[],"_links":{"self":[{"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/posts\/171573","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/users\/47"}],"replies":[{"embeddable":true,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/comments?post=171573"}],"version-history":[{"count":3,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/posts\/171573\/revisions"}],"predecessor-version":[{"id":216612,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/posts\/171573\/revisions\/216612"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/media\/171575"}],"wp:attachment":[{"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/media?parent=171573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liora.io\/de\/wp-json\/wp\/v2\/categories?post=171573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}