Drizzle ORM
Regeln
- Schema-Definition:
pgTable() / mysqlTable() / sqliteTable() in src/db/schema.ts
- Entwicklung:
drizzle-kit push für schnelle Iteration – keine Migrationsdateien erforderlich
- Produktion:
drizzle-kit generate + drizzle-kit migrate für nachvollziehbare Migrationshistorie
- Typsichere Abfragen:
db.select().from(users).where(eq(users.email, email)) – vollständige TypeScript-Inferenz
- Relationen: Definiere mit dem
relations()-Helfer – one() und many() für relationale Abfragen mit db.query
- Prepared Statements:
db.select().from(users).where(eq(users.id, sql.placeholder("id"))).prepare() – Wiederverwenden für heiße Pfade
- Transaktionen:
db.transaction(async (tx) => { ... }) – verwende tx und nicht db innerhalb des Callbacks
- Indizes: Definiere inline mit
.index() oder in der Tabellenkonfiguration – füge sie für Spalten hinzu, die in where und orderBy verwendet werden
- Drizzle Studio:
npx drizzle-kit studio für den visuellen Datenbankbrowser während der Entwicklung
Patterns
import { pgTable, text, timestamp, uuid, integer } from "drizzle-orm/pg-core";
import { relations } from "drizzle-orm";
export const users = pgTable("users", {
id: uuid("id").primaryKey().defaultRandom(),
name: text("name").notNull(),
email: text("email").notNull().unique(),
createdAt: timestamp("created_at").defaultNow().notNull(),
});
export const posts = pgTable("posts", {
id: uuid("id").primaryKey().defaultRandom(),
title: text("title").notNull(),
authorId: uuid("author_id").references(() => users.id).notNull(),
});
export const usersRelations = relations(users, ({ many }) => ({
posts: many(posts),
}));
export const postsRelations = relations(posts, ({ one }) => ({
author: one(users, { fields: [posts.authorId], references: [users.id] }),
}));
const result = await db.query.users.findFirst({
where: eq(users.id, userId),
with: { posts: true },
});
Vermeiden
drizzle-kit push in der Produktion – verwende generate + migrate für nachvollziehbare Migrationen
- Rohes SQL, wenn die Drizzle-API es abdeckt – verwende das
sql-Template-Tag nur für komplexe Ausdrücke
- Vergiss nicht die
relations()-Definitionen – ohne sie funktionieren relationale db.query-Abfragen nicht
- N+1-Abfragen – verwende
with in db.query, um Relationen in einer einzigen Abfrage zu verbinden
- Fehlende Indizes auf Fremdschlüsseln und gefilterten Spalten – Drizzle erstellt sie nicht automatisch