Die flexible lowdb für kleine Experimente

Node.js-Module: lowdb als leichtgewichtige Datenbankalternative
Keine Kommentare

Datenbanken sind für die Persistierung von Daten in Node.js-Applikationen unerlässlich. Je nach Anwendungsfall können Sie auf die verschiedensten Implementierungen zurückgreifen. Eine schlanke Alternative zu schwergewichtigen Datenbanken ist lowdb.

Allen Datenbanken gemein ist, dass Sie die Datenbanksoftware installieren müssen und einen Serverprozess ausführen müssen. In einigen Szenarien bedeutet das allerdings einen unnötig großen Overhead. Gerade wenn Sie nur schnell etwas testen möchten oder Sie sich in einer Umgebung befinden, in der Sie keine zusätzliche Software installieren dürfen.

Eine leichtgewichtige Alternative hierfür bietet SQLite, eine dateibasierte SQL-Datenbank. Aber Sie müssen auch hier den Datenbanktreiber kompilieren. Um das zu vermeiden, existiert die Datenbank namens lowdb. Diese Datenbank basiert auf der Bibliothek Lodash. Die Daten werden in einer JSON-Datei festgehalten. Da die Datenbank die Daten im Klartext ablegt, reicht sie keinesfalls an die Performance einer vollwertigen Datenbank heran, die die Informationen normalerweise in einem optimierten Binärformat speichern. Aus diesem Grund empfiehlt sich auch der Einsatz von lowdb im Produktivbetrieb nicht.

Installation und erste Schritte

lowdb kann über NPM und Yarn installiert werden. Für NPM lautet das Kommando beispielsweise npm install lowdb. Für den Zugriff auf die Daten kommt eine Adapterschicht zum Einsatz. lowdb liefert eine Reihe von Adaptern aus. Die wichtigsten sind FileSync und FileAsync für den synchronen beziehungsweise asynchronen Zugriff.

iJS React Cheat Sheet

Free: React Cheat Sheet

You want to improve your knowledge in React or just need some kind of memory aid? We have the right thing for you: the iJS React Cheat Sheet (written by Joel Lord). Now you will always know how to React!


Bevor Sie mit der Datenbank arbeiten können, müssen Sie zunächst den Adapter initialisieren. Dabei übergeben Sie dem Konstruktor den Namen der Datei, in der die Informationen festgehalten werden sollen. Die Datei kann bereits bestehen und mit Informationen vorbefüllt sein. Ist die Datei nicht vorhanden, wird sie von lowdb angelegt. Die Objektrepräsentation des Adapters übergeben Sie anschließend an lowdb. Existiert die Datenbankdatei noch nicht, müssen Sie die Struktur der Datenbank vordefinieren. Hierfür rufen Sie die defaults-Methode auf und übergeben ihr die Namen der einzelnen Objektspeicher. Anschließend rufen Sie die write-Methode auf, um die Informationen zu persistieren. Listing 1 fasst diese Schritte für Sie zusammen:

const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');

const adapter = new FileSync('db.json');
const db = low(adapter);

db.defaults({ users: [] }).write();

In den folgenden Abschnitten sehen Sie, wie Sie mit lowdb alle CRUD-Operationen durchführen können.

Datensätze erstellen

Beginnen Sie nicht bereits mit einer gefüllten Datenbank, besteht der erste Schritt darin, neue Datensätze anzulegen, die Sie zu einem späteren Zeitpunkt auslesen können. lowdb stellt Ihnen hierfür die push-Methode zur Verfügung. Der Zugriff auf einen Objektspeicher erfolgt immer nach demselben Schema: Zuerst holen Sie sich eine Referenz auf den gewünschten Objektspeicher, danach führen Sie die eigentliche Operation aus und rufen dann die write-Methode auf, um die Operation zu persistieren. Ein konkretes Beispiel für eine solche erstellende Operation finden Sie in Listing 2.

const user = {
  id: 1,
  firstname: 'Klaus',
  lastname: 'Müller',
  year: 1970
}

db.get('users').push(user).write();

Führen Sie den Code aus Listing 1 und 2 aus, wird die Datei db.json erzeugt, die ein JSON-Objekt mit dem Schlüssel users und einem Array als Wert enthält, das das Benutzerobjekt aus Listing 2 aufweist.

Datensätze auslesen

Nachdem Sie nun über einen ersten Datensatz verfügen, können Sie dazu übergehen, diesen auch wieder aus der Datenbank auszulesen. Da Sie momentan den FileSync-Adapter nutzen, müssen Sie sich nicht um Callback-Funktionen oder Promises kümmern, sondern erhalten direkt den Wert aus der Datenbank. Im einfachsten Fall rufen Sie auf dem Objektspeicher die value-Methode auf. Damit erhalten Sie alle Datensätze als Array. Sind Sie nur an bestimmten Datensätzen interessiert, können Sie die filter-Methode nutzen. Zum Sortieren kommt die sort-Methode zum Einsatz. Listing 3 sorgt dafür, dass in die Variable klaus nur Benutzerobjekte mit dem Vornamen Klaus eingefügt werden.

const klaus = db.get('users')
  .filter({firstname: 'Klaus'})
  .value();
console.log(klaus);

Datensätze aktualisieren

Die Datensätze in der Datenbank können mit lowdb auch problemlos aktualisiert werden. Hierfür muss der Datensatz zunächst mit der find-Methode lokalisiert werden. Anschließend kann der Wert mithilfe der assign-Methode geändert werden. Um die Änderung wirksam werden zu lassen, muss die write-Methode aufgerufen werden. In Listing 4 wird die Eigenschaft firstname des Datensatzes geändert.

db.get('users')
  .find({firstname: 'Klaus'})
  .assign({firstname: 'Hans-Peter'})
  .write();

Beim Aufruf der assign-Methode werden die angegebenen Felder mit den entsprechenden Werten überschrieben. Alle Felder, die nicht angegeben werden, bleiben unverändert.

Datensätze löschen

Ähnlich wie die find-Methode zur Lokalisierung von Datensätzen kann auch die remove-Methode zum Löschen von Datensätzen verwendet werden. Sie müssen lediglich die Kriterien in Form eines Objekts übergeben. Auch hier ist der Aufruf der write-Methode erforderlich, um die Änderung zu persistieren. In Listing 5 wird der Datensatz mit dem Vornamen Hans-Peter gelöscht.

db.get('users')
  .remove({firstname: 'Hans-Peter'})
  .write();

Ob die Löschoperation funktioniert hat, können Sie entweder mit einer lesenden Abfrage oder einem Blick in die db.json-Datei überprüfen.

Asynchroner zugriff

Die Beispiele bisher haben den FileSync-Adapter verwendet. Die meisten Datenbanken arbeiten jedoch asynchron, um die Ausführung der Applikation nicht zu blockieren. Auch lowdb verfügt über einen asynchronen Adapter. Statt des FileSync-Adapters müssen Sie den FileAsync-Adapter instanziieren und ihn an lowdb übergeben. Anschließend können Sie die Schnittstellen von lowdb wie gewohnt verwenden. Der einzige Unterschied besteht darin, dass sowohl die write– als auch die value-Methode Promises statt konkreter Werte zurückgeben. Um den Quellcode übersichtlicher zu halten, bietet sich die Verwendung von async/await an. In Listing 6 sehen Sie ein Beispiel, in dem zunächst ein Datensatz erstellt und anschließend wieder aus der Datenbank ausgelesen wird.

const adapter = new FileAsync('db.json');

(async function () {
  const db = await low(adapter);
  db.defaults({ users: [] }).write();

  const user = {
    id: 1,
    firstname: 'Klaus',
    lastname: 'Müller',
    year: 1970
  }
  await db.get('users').push(user).write();

  const klaus = await db.get('users')
    .filter({firstname: 'Klaus'})
    .value();

    console.log(klaus);
})();

Fazit

Lowdb ist eine leichtgewichtige und flexible Datenbank, die sich gerade für kleine Experimente hervorragend eignet. In jeder Umgebung, in der eine umfangreiche Datenbank zu viel Overhead bedeutet oder ein Datenbanktreiber nicht installiert werden kann, lässt sich lowdb als Alternative verwenden. Das npm-Paket json-server setzt beispielsweise auf lowdb.

PHP Magazin

Entwickler MagazinDieser Artikel ist im PHP Magazin erschienen. Das PHP Magazin deckt ein breites Spektrum an Themen ab, die für die erfolgreiche Webentwicklung unerlässlich sind.

Natürlich können Sie das PHP Magazin über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist das Entwickler Magazin ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -