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
- Kapcsolati pooling megfelelő konfigurálása
- Minimális jogosultságok elve az adatbázis felhasználónál
- Érzékeny adatok titkosítása
Utoljára frissítve: