Prisma i Drizzle ORM
Schema-first Prisma vs SQL-first Drizzle — TypeScript ORMs, migracje, connection pooling i edge deployment w 2024.
6 ORM dla TypeScript
Prisma, Drizzle, TypeORM, MikroORM, Sequelize i Kysely — każdy ORM reprezentuje inny model mentalny i kompromis między DX a kontrolą.
| ORM | Podejście | Type Safety | Bundle Size | Edge | Kiedy |
|---|---|---|---|---|---|
| Prisma | Schema-first (PSL) | Generowane typy | 5MB+ | Prisma Accelerate | Nowe projekty TS, DX priorytet, fullstack |
| Drizzle | SQL-first (TypeScript) | InferSelectModel | 7KB (treeshakeable) | Natywny (CF Workers) | Edge computing, bundle size, SQL kontrola |
| TypeORM | Data Mapper / Active Record | Dekoratory | Duży | Nie | Legacy projekty, Java-like patterns |
| MikroORM | Unit of Work + Identity Map | Dekoratory | Duży | Nie | TypeORM alternative, enterprise |
| Sequelize | Active Record | Przez plugin | Duży | Nie | Legacy JavaScript, istniejące projekty |
| Kysely | Query builder (TS) | Pełen (compile time) | Mały | Tak | SQL kontrola + type safety, bez magic |
Często zadawane pytania
Co to jest Prisma ORM i jak działa schema-first approach?
Prisma: nowoczesny ORM dla TypeScript i Node.js (Prisma Data, 2019). Schema-first approach: definiujesz model w schema.prisma (Prisma Schema Language). Prisma generuje TypeScript typy automatycznie. Trzy komponenty Prisma: Prisma Client — auto-generated, type-safe query builder. Prisma Migrate — migracje bazy danych z schema. Prisma Studio — GUI do przeglądania danych. Przykład schema: model User {id Int @id @default(autoincrement()). name String. email String @unique. posts Post[]}. Prisma Client query: const user = await prisma.user.findUnique({where: {email: 'test@test.pl'}, include: {posts: true}}). TypeScript zna typ user: User & {posts: Post[]}. Relacje Prisma: one-to-one, one-to-many, many-to-many. @relation dekorator. Implicit many-to-many (join table automatyczna). Filtry: where: {AND, OR, NOT, contains, startsWith, gt, gte, lt, lte, in, notIn}. Zagnieżdżone queries: include (eager loading), select (projekcja). Raw queries: prisma.$queryRaw, prisma.$executeRaw. Transakcje: prisma.$transaction([...]). Interactive transactions. Bazy danych: PostgreSQL, MySQL, SQLite, SQL Server, MongoDB, CockroachDB. Prisma Accelerate: connection pooling + global edge cache. Prisma Pulse: real-time database events.
Drizzle ORM — co to jest i dlaczego jest alternatywą dla Prisma?
Drizzle ORM: TypeScript ORM z SQL-first approach (2022). Filozofia: 'If you know SQL, you know Drizzle'. Minimalistyczny, bez magic. SQL-like API zamiast abstrakcji. Drizzle Schema (TypeScript): const users = pgTable('users', {id: serial('id').primaryKey(), name: text('name').notNull(), email: varchar('email', {length: 255}).notNull().unique()}). Queries: db.select().from(users).where(eq(users.email, 'test@test.pl')). db.insert(users).values({name: 'Jan', email: 'jan@example.pl'}). db.update(users).set({name: 'Nowe'}).where(eq(users.id, 1)). Joins: db.select().from(users).innerJoin(posts, eq(posts.userId, users.id)). SQL-like, czytelny. Drizzle Kit: CLI do migracji. drizzle-kit generate — generuj SQL migration. drizzle-kit push — push schema do DB bez migracji (dev). drizzle-kit migrate — uruchom migracje. Zalety Drizzle vs Prisma: Bundle size: Drizzle 7KB (treeshakeable), Prisma 5MB+. Edge ready (Cloudflare Workers, Vercel Edge). Brak osobnego CLI binarnego (Prisma wymaga). SQL transparent (zero magic). Szybszy (mniej overhead). Wady Drizzle vs Prisma: Mniej dojrzały ekosystem. Mniej integracji. Pisanie w SQL-style mniej intuicyjne dla beginnerów. Bazy danych: PostgreSQL (postgres-js, node-postgres). MySQL (mysql2). SQLite (better-sqlite3, libsql, Bun). Turso (libSQL — SQLite na edge). Neon, PlanetScale, CockroachDB.
Prisma Migrate vs Drizzle Kit — zarządzanie migracjami bazy danych?
Prisma Migrate: workflow declaratywny. Edytujesz schema.prisma. npx prisma migrate dev -- name add_user_role. Prisma generuje SQL migration. Git tracking migracji. prisma migrate deploy — produkcja (bez interaktywności). Zalety Prisma Migrate: automatyczne generowanie SQL. Bezpieczne (shadow database do porównania). Historia migracji. Baseline dla istniejących baz (prisma migrate resolve). Problemy Prisma Migrate: shadow database wymagana (nie zawsze możliwa). Niektóre operacje nieobsługiwane (custom SQL w migracji). Drizzle Kit migracje: drizzle-kit generate — generuj SQL based on schema changes. Ręczna kontrola nad SQL. drizzle-kit push — dev only (push bez migracji). Wspólne zasady bezpiecznych migracji: addytywne zmiany (dodawaj kolumny nullable). Nigdy nie usuwaj kolumn bez najpierw deploymentu. expand-contract pattern. Prisma Studio: GUI do przeglądania i edycji danych. npx prisma studio. Port 5555. Zarządzanie rekordami. Drizzle Studio: drizzle-kit studio. Podobna funkcjonalność. TypeScript integracja: Prisma — generowane typy w @prisma/client. Drizzle — typy z InferSelectModel, InferInsertModel. Oba dostarczają pełen type safety dla queries.
Prisma vs Drizzle vs TypeORM vs Sequelize — kiedy co wybrać?
TypeORM: dojrzały ORM (2016), Active Record i Data Mapper pattern. Dekoratory TypeScript (@Entity, @Column, @PrimaryGeneratedColumn). Duży ekosystem. Problemy: wolny development, bugi, brak maintainera. 2024: TypeORM nadal używany w legacy. MikroORM: alternatywa TypeORM. Unit of Work pattern. Identity Map. Lepiej maintainowany. Sequelize: ORM dla JavaScript (2010). Promise-based. Nie-TypeScript-first (typy przez sequelize-typescript). Legacy choice. 2024 kiedy co wybrać: Prisma: nowe projekty TypeScript gdzie developer experience priorytetem. Fullstack (Next.js, Remix, SvelteKit). Chcesz Prisma Studio i Prisma Accelerate. Dobre dokumentacja ważna. Drizzle: edge computing (Cloudflare Workers, Vercel Edge Functions). Bundle size krytyczny. Chcesz SQL kontrolę i transparentność. Performance-critical. TypeORM/MikroORM: istniejące projekty. Decorator-based approach preferowany. Enterprise Java-like patterns. Sequelize: legacy JavaScript projekty. Nie TypeScript. Prisma + T3 Stack: Prisma integracja z tRPC + Next.js + Prisma + NextAuth. create-t3-app. Drizzle + Hono: lightweight API. Edge deployment. Bun + SQLite: Drizzle z libSQL/Bun sqlite.
Connection pooling i wydajność ORM — PgBouncer, Prisma Accelerate i Neon?
Problem connection pooling z ORM: każda serverless function tworzy nowe połączenie z DB. PostgreSQL limit connections (domyślnie 100). Bez pooling: connection exhaustion. PgBouncer: zewnętrzny connection pooler. Transaction mode (serverless friendly). Session mode (stateful). Statement mode (ograniczenia). Prisma Accelerate: Prisma managed connection pooler + edge cache. Globalnie dystrybuowany. Stale-while-revalidate cache per query. Prisma.$extends(withAccelerate()). cache({ttl: 60, swr: 10}) per query. Neon serverless driver: @neondatabase/serverless. WebSocket-based connection (edge compatible). Łaczy się przez HTTP dla single queries (zero connection overhead). Serverless-native PostgreSQL. Supabase: PostgreSQL + PostgREST + Realtime + Auth + Storage. Wbudowany connection pooler (Supavisor). SDK dla Next.js. Drizzle + Neon: import {neon} from '@neondatabase/serverless'. drizzle(neon(DATABASE_URL)). Edge-ready. Turso (libSQL): SQLite na edge. Distributed SQLite. Drizzle integration. Embedded replicas. Rekomendacje 2024: Serverless/Edge + Prisma -> Prisma Accelerate. Serverless/Edge + Drizzle -> Neon serverless driver lub Turso. Traditional server -> PgBouncer transaction mode. Supabase -> własny pooler (Supavisor).
Powiązane artykuły
Skontaktuj się z nami
Porozmawiajmy o Twoim projekcie. Bezpłatna wycena w ciągu 24 godzin.
Wyślij zapytanie
Telefon
+48 790 814 814
Pon-Pt: 9:00 - 18:00
adam@fotz.pl
Odpowiadamy w ciągu 24h
Adres
Plac Wolności 16
61-739 Poznań
Godziny pracy
Wolisz porozmawiać?
Zadzwoń teraz i porozmawiaj z naszym specjalistą o Twoim projekcie.
Zadzwoń teraz