Skip to Content
Megérkezett a Planitapp dokumentációja. 🎉

Drizzle ORM

Áttekintés

Az alkalmazás a Drizzle ORM-et használja az adatbázis műveletek kezeléséhez, amely egy TypeSafe (Típusbiztos), Lightweight (Könnyűsúlyú) ORM megoldás TypeScript-hez. A Neon-on host-olt PostgreSQL adatbázissal való kommunikációt biztosítja, modern és hatékony API-n keresztül.

A @vercel/postgres csomagot használja az alkalmazás, amelyet a fejlesztés kezdetén Vercel Storage-ben később Neon integrációban került host-olásra.

Mappa Struktúra

      • migration_files.sql
      • chat.ts
      • projects.ts
      • user.ts
    • index.ts

Drizzle Inicializálása

Itt a sémákkal együtt exportáljuk a db objektumot, amelyet lekérdezéseknél használunk.

database/index.ts
import { sql } from "@vercel/postgres" import { drizzle } from "drizzle-orm/vercel-postgres" import * as projectsSchema from "@/database/schema/projects" import * as userSchema from "@/database/schema/user" import * as chatSchema from "@/database/schema/chat" export const db = drizzle(sql, { schema: { ...projectsSchema, ...userSchema, ...chatSchema, }, })

Környezeti Változók

.env.local
POSTGRES_URL="" POSTGRES_PRISMA_URL="" POSTGRES_URL_NO_SSL="" POSTGRES_URL_NON_POOLING="" POSTGRES_USER="" POSTGRES_HOST="" POSTGRES_PASSWORD="" POSTGRES_DATABASE=""

Migráció Kezelés

Migrációs Konfiguráció

drizzle.config.ts
import { defineConfig } from "drizzle-kit" import { config } from "dotenv" config({ path: ".env.local" }) export default defineConfig({ schema: "./database/schema/*.ts", out: "./database/migrations", dialect: "postgresql", dbCredentials: { url: process.env.POSTGRES_URL as string, }, })

Migrációs Parancsok

# Migrációs fájl készítése bunx --bun drizzle-kit generate # Migráció futtatása bunx --bun drizzle-kit push

Adatbázis Műveletek

Lekérdezések

// Egyszerű lekérdezés // Lekérjük a felhasználó adatait const [getUserInformation] = await db .select() .from(UsersTable) .where(eq(UsersTable.id, session.user.id)) .limit(1) // Kapcsolt lekérdezés // Lekérjük, hogy a user tagja e egy adott projektnek, ahova megpróbál const [projectAccess] = await db .select({ isOwner: eq(ProjectsTable.userId, session.user.id as string), isMember: ProjectMembersTable.id, }) .from(ProjectsTable) .leftJoin( ProjectMembersTable, and( eq(ProjectMembersTable.projectId, projectId), eq(ProjectMembersTable.userId, session.user.id as string) ) ) .where(eq(ProjectsTable.id, projectId)) .limit(1)

Beszúrás

// Egy rekord beszúrása const [conversation] = await db .insert(ChatConversationsTable) .values({ userId, title: validatedFields.data.message.length > 32 ? validatedFields.data.message.trim().slice(0, 32) + "..." : validatedFields.data.message.trim(), }) .returning({ id: ChatConversationsTable.id, })

Törlés

await db .delete(ChatConversationsTable) .where(eq(ChatConversationsTable.id, conversationId))

Hibakezelés

// Bármilyen hiba történik a query közben, azt a try catch blokk elkapja és visszatér egy hibával try { await db .delete(ChatConversationsTable) .where(eq(ChatConversationsTable.id, conversationId)) } catch (error: any) { return { success: false, message: error instanceof Error ? error.message : "Hiba történt!", } }

Karbantartás és Monitorozás

  • Query teljesítmény monitorozása
  • Kapcsolatok számának és időtartamának figyelése

Biztonsági Megfontolások

  1. Kapcsolati pooling megfelelő konfigurálása
  2. Minimális jogosultságok elve az adatbázis felhasználónál
  3. Érzékeny adatok titkosítása
Utoljára frissítve: