ORM für JavaScript (Node.js): Vergleich und Beispiele
Bei der Entwicklung serverseitiger Anwendungen mit Node.js stellt sich früher oder später die Frage der Interaktion mit der Datenbank. Das Schreiben von reinen SQL-Abfragen ist eine aufwändige und fehleranfällige Aufgabe. Hier helfen ORM (Object-Relational Mapping) – Bibliotheken, die es ermöglichen, mit Datenbanktabellen wie mit gewöhnlichen JavaScript-Objekten zu arbeiten. In diesem Artikel vergleichen wir die drei beliebtesten ORMs für Node.js: Sequelize, TypeORM und Prisma, und zeigen anschauliche Codebeispiele.
1. Sequelize
Sequelize ist eines der ältesten und ausgereiftesten ORMs für Node.js. Es unterstützt PostgreSQL, MySQL, MariaDB, SQLite und Microsoft SQL Server. Sequelize verwendet den klassischen Ansatz mit Modellen und Promises (oder async/await).
Installation
npm install sequelize pg pg-hstoreBeispiel: Modell-Definition und Abfrage
const { Sequelize, DataTypes } = require('sequelize');const sequelize = new Sequelize('database', 'user', 'password', { host: 'localhost', dialect: 'postgres'});
const User = sequelize.define('User', { name: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, unique: true }});
async function createUser() { await sequelize.sync(); const user = await User.create({ name: 'Ivan', email: 'ivan@example.com' }); console.log(user.toJSON());}createUser();Besonderheiten von Sequelize
- Ausgereiftheit und große Community.
- Unterstützung von Transaktionen, Migrationen und Seed-Daten.
- Flexibles System für Assoziationen (hasOne, hasMany, belongsToMany).
- Nachteil: stellenweise umständliche Syntax und schwieriges Debugging.
2. TypeORM
TypeORM ist ein ORM, das sowohl mit JavaScript als auch mit TypeScript arbeiten kann. Es unterstützt dieselben DBMS wie Sequelize und bietet zwei Ansätze: Active Record und Data Mapper. TypeORM verwendet zudem aktiv Decoratoren, was den Code deklarativer macht.
Installation
npm install typeorm reflect-metadata pgBeispiel: Modell mit Decorator und Abfrage
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';
@Entity()class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
async function createUser() { const connection = await createConnection({ type: 'postgres', host: 'localhost', database: 'test', entities: [User], synchronize: true }); const user = new User(); user.name = 'Maria'; user.email = 'maria@example.com'; await connection.manager.save(user); console.log(user);}createUser();Besonderheiten von TypeORM
- Hervorragende Integration mit TypeScript und Decoratoren.
- Flexibilität: Wahl zwischen Active Record und Data Mapper.
- Unterstützung von Migrationen, Event-Subscribern und Logging.
- Nachteil: Dokumentation ist stellenweise unvollständig, häufige Breaking Changes.
3. Prisma
Prisma ist ein modernes ORM, das sich grundlegend von seinen Vorgängern unterscheidet. Anstatt Modelle im Code zu definieren, beschreiben Sie das Datenschema in einer speziellen Datei schema.prisma, und Prisma generiert einen typsicheren Client. Dies ermöglicht Autovervollständigung in der IDE und minimiert Fehler.
Installation
npm install @prisma/clientnpx prisma initBeispiel: Schema und Abfrage
schema.prisma:
datasource db { provider = "postgresql" url = env("DATABASE_URL")}
model User { id Int @id @default(autoincrement()) name String email String @unique}JavaScript-Code:
const { PrismaClie Auch in der Bibliothek
Swift-QR-Code-Generator: Bibliothek EFQRCode für iOS und macOS
CLI-Framework für Rust: Vollständiger Leitfaden zur Entwicklung von Dienstprogrammen
WebSocket in Node.js: Die ws-Bibliothek für Echtzeitkommunikation
Konfiguration von C#-Anwendungen (.NET): Microsoft.Extensions.Configuration