Eine Webanwendung mit MongoDB und Bottle

© Mikhail Dudarev, 123RF

Flaschengeist

Für ein aktuelles Projekt habe ich vor Kurzem nach einem stabilen, flexiblen und gut skalierbaren Datenbackend für eine Webapplikation gesucht. Bereits nach kurzer Zeit fiel die Wahl auf die NoSQL-basierte MongoDB.
Obwohl Linux als freie Software kostenlos verfügbar ist, setzen viele beim Unternehmenseinsatz auf Enterprise-Distributionen mit Support. Wo die Stärken der ... (mehr)

Die üblichen Verdächtigen für Datenbank-Systeme im OpenSource-Bereich waren in der Vergangenheit schnell ausgemacht. In Zeiten von Web 2.0 hat sich jedoch einiges geändert. Statt von MySQL oder PostgreSQL spricht man heute eher von CouchDB, FluidDB oder MongoDB. Diese Datenbanken haben einen ähnlichen Funktionsumfang wie klassische SQL-Server, besitzen dabei allerdings eine wesentlich höhere Performance und Skalierbarkeit. Diese reicht zwar nicht an Systeme wie Memcached oder andere einfache Key/Value-Store-Systeme heran, jedoch wird dieses Manko durch den erhöhten Funktionsumfang bei immer noch ausgezeichneter Performance wettgemacht.

Hinzu kommt, dass die Performance von solchen Systemen sehr gut in der Breite skaliert. Anstatt also teure Hardware einkaufen zu müssen, lässt sich eine Datenbank leicht über mehrere Systeme verteilen, ohne dass negative Auswirkungen auf die Funktionalität zu befürchten wären.

MongoDB

MongoDB ist in allen größeren Linux-Distributionen bereits enthalten. Im Zusammenspiel mit Python und einem Webframework lassen sich hiermit in kurzer Zeit beachtliche Erfolge erzielen. In meinem Beispiel kommt das Micro- Webframework Bottle zum Einsatz. Dieses sehr einfache Framework besteht aus einer einzelnen Datei, welche mittels »easy_install« auf dem eigenen System installiert wird. Das Framework eignet sich für erste Tests mit MongoDB sehr gut, da es keinerlei Abhängigkeiten, ausser auf die Python-Standard-Bibliothek, besitzt, dabei jedoch eine Menge an Funktionalität anbietet. So unterstützt es beispielsweise auch Templates und bringt einen Webserver von Haus aus mit. Als Schnittstelle zwischen dem MongoDB-Service und dem Webframework Bottle setze ich Pymongo ein, welches ebenfalls in den meisten Distributionen bereits zur Verfügung stehen sollte.

MongoDB unterteilt eine Datenbank in sogenannte Collections, in denen Dokumente gespeichert sind. Diese enthalten die Datenbank-Objekte im JSON-Format. Das Schöne dabei ist, dass die Collections keinem Schema unterliegen. Das bedeutet, man kann einfach die gewünschten Daten in die Datenbank übertragen, ohne sich groß Gedanken über Schema-Anpassungen machen zu müssen. Das vereinfacht die Arbeit ungemein. Die einzelnen Felder eines Dokuments können dabei immer noch nach Belieben angefragt werden, und auch Indizes lassen sich für oft abgefragte Felder setzen.

Für einen ersten Test verwende ich die Mongo-Shell, um ein solches Dokument zu erzeugen (Listing 1).

Listing 1

Test

 

Schemalos

In dem Beispiel ist schön zu sehen, dass sich die Datensätze durch das Feld Mitglieder unterscheiden. In zwei Datensätzen ist es enthalten, im dritten Dokument fehlt es komplett, was aber kein Problem ist, da MongoDB ja über kein fixes Schema verfügt.

Wer seine Dokumente bereits im JSON-Format vorliegen hat, der kann diese ganz in einem Streich in die Datenbank importieren:

# mongoimport -d football -c clubs --file /tmp/myclubs.json
connected to: 127.0.0.1
Mon Dec  3 08:43:26 imported 23 objects

Ein Dokument mit einem bestimmten Feld abzufragen, ist auch recht einfach:

> db.clubs.find({Mitglieder: {"$gt": 100000}}){ "_id" : ObjectId("50bd2169a80e4531863ea2a8"), "Name" : "FC Schalke 04", "Farben" : "BlauWeiß", "Mitglieder" : 111000, "Anschrift" : [   {   "Strasse" : "Ernst-Kuzorra-Weg 1", "PLZ" : 45891, "Stadt" : "Gelsenkirchen" } ] }

Für eine kleine Webanwendung fehlt nun noch ein passendes Framework und ein Stück Software, welches die Verbindung zwischen Framework und MongoDB herstellt. Für Erstes kommt, wie eingangs erwähnt, das Micro-Framework Bottle zum Einsatz. Um die Funktionen zu demonstrieren, greift die Beispielanwendung auf Templates und Views zurück, auch wenn dies hier nicht zwingend erforderlich ist. Pymongo stellt die Schnittstelle zwischen Framework und Datenbank her und überträgt die Dokumente im BSON-Format über das Netz.

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019