Node.js-Module: node-orm2

Object-Relational Mapping für Node.js
Kommentare

In dieser Reihe möchte ich Ihnen in jeder Ausgabe ein nützliches Modul für Node.js vorstellen. In dieser Ausgabe beginne ich mit node-orm2.

Der Zugriff von Node.js auf eine Datenbank stellt kein sonderlich großes Problem dar, da für nahezu jede Datenbank ein Treiber für Node.js existiert. So können Sie beispielsweise MySQL, MSSQL, Redis, MogoDB oder DB2 anbinden, um nur einige wenige zu nennen. In vielen Fällen reicht es aus, die Abfragestatements von Hand zu formulieren. Manchmal wünscht man sich jedoch eine zusätzliche Abstraktionsschicht zwischen der Datenbank und dem eigenen Quellcode. Gibt es kein Doctrine für Node.js? Die Antwort ist leider nein. Allerdings existieren andere Implementierungen von Object-Relational Mapping oder kurz ORM. Eines davon heißt „node-orm2“.

R. I. P. Node.js
Der König ist tot – lang lebe der König! So oder so ähnlich lässt sich die Situation rund um den Node.js-Fork io.js zusammenfassen. Alle Hintergründe unter R.I.P: Node.js: Es lebe io.js! und Node.js im Spiel der Mächte: Was will StrongLoop wirklich mit io.js?.

Dieses als NPM-Paket verfügbare Modul ist Open Source, der Quellcode ist auf GitHub verfügbar. Installiert wird das Modul mit dem Kommando npm install orm. Aktuell werden MySQL, PostgreSQL, Amazon Redshift, SQLite und teilweise MongoDB unterstützt. Damit Sie das ORM-Modul benutzen können, benötigen Sie den passenden Treiber für Ihre Datenbank, den Sie vor dem ORM laden sollten. Das Modul erkennt über den Connection-String die Datenbank und nutzt den geladenen Treiber für die Verbindung.

Die Verbindung

Das Modul wird über das Modulsystem von Node.js mit der require-Funktion geladen. Über das zurückgegebene Objekt bauen Sie dann die Verbindung zur Datenbank auf: orm.connect(’sqlite:db/app.db‘, function(err, db) {});. Diese Codezeile stellt eine Verbindung zu einer lokalen SQLite-Datenbank her. Diese Operation ist asynchron, was bedeutet, dass Sie eine Callback-Funktion registrieren müssen. Das erste Argument ist ein Fehlerobjekt, das normalerweise den Wert null aufweist und nur im Fehlerfall einen abweichenden Wert enthält. Das zweite Argument ist der Datenbank-Handle, mit dem Sie weiterarbeiten.

Die Definition

Haben Sie sich erst einmal erfolgreich mit der Datenbank verbunden, definieren Sie mit der define-Methode das Aussehen Ihrer Tabellen. Gehen Sie von einer einfachen Tabelle mit drei Feldern aus, könnte eine Definition folgendermaßen aussehen:

var User = db.define('user', {
  id: Number,
  name: String,
  age: Number
});

Über das User-Objekt können Sie dann mit der user-Tabelle arbeiten.

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.

Das API

Das ORM-Modul stellt Ihnen eine ganze Reihe von Methoden zur Verfügung, mit denen Sie Datensätze generieren, auslesen, aktualisieren oder auch löschen können. Tabelle 1 gibt eine kurze Übersicht über einige der möglichen Methodenaufrufe.

Tabelle 1: Methodenaufrufe von „node-orm2“

Tabelle 1: Methodenaufrufe von „node-orm2“

Haben Sie Datensätze ausgelesen, können Sie diese außerdem modifizieren oder löschen. Zu diesem Zweck greifen Sie auf die save- beziehungsweise remove-Methode zurück. Wie das Aktualisieren eines Datensatzes konkret funktioniert, sehen Sie hier:

User.find({name: 'Klaus'}, function(err, data) {
  data[0].name = ‚Hans-Peter';
  data[0].save();
});

Weitere Features

Das ORM-Modul unterstützt Sie nicht nur beim Auslesen und Schreiben von Datensätzen in eine einzelne Tabelle. Sie können auch Relationen wie hasOne oder hasMany definieren.

Außerdem besteht die Möglichkeit, dass Sie für die Felder einer Tabelle Validatoren registrieren, die vor dem Schreiben eines Datensatzes ausgeführt werden und die Gültigkeit eines Datensatzes prüfen. Schlägt diese Prüfung fehl, wird der Datensatz nicht in die Datenbank geschrieben und Sie erhalten eine entsprechende Fehlermeldung.

Auch die Integrität der ausgelesenen Inhalte wird gewahrt. So können Sie beispielsweise einen Datensatz mehrmals abfragen. Änderungen an diesem Datensatz werden dann an allen Stellen angewandt.

Fazit

Das ORM ist ein hilfreiches Werkzeug, wenn es um die Arbeit mit Datenbanken geht. Es gelten allerdings auch hier einige Einschränkungen. Bevor Sie das ORM in einer produktiven Applikation nutzen, sollten Sie sich sehr gut mit dem API und dem Funktionsumfang des Moduls vertraut machen.

Wenn es um hochperformante Applikationen geht, ist das ORM einer der ersten Kandidaten, der entfernt wird. Hierfür gibt es mehrere Gründe: die Queries, die das ORM generiert, lassen sich kaum beeinflussen, und jede Abstraktionsschicht kostet Performance.

Bevor Sie das ORM allerdings komplett aus Ihrer Applikation verbannen, greifen Sie einfach auf die execQuery-Methode zurück, mit der Sie beliebige Abfragen manuell formulieren und absetzen können.

Aufmacherbild: Quality coding concept design von Shutterstock / Urheberrecht: mamanamsai

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -