Nodejs —1: Prisma / Çoklu Veritabanı
Prisma, birçok veritabanını içinde barındıran ve veritabanı geçişinizi kolaylaştıracak bir kütüphane.
En güzel olaylarından biri veritabanı geçişi yani mysql’den mongodb’ye geçişimizi kolaylaştırıyor.
Veritabanı sorgularını kolaylaştırıyor. Ayrıca tip güvenliği sağlayıp, otomatik şema oluşturmamızı sağlıyor.

İlk olarak kütüphamizi kuralım:
npm i prisma @prisma/client
npx prisma init
npx prisma generate
Prisma şema oluşturduktan sonra migrate yapalım:
npx prisma migrate dev --name init
Sonra prisma init yaptığımız klasör dizinine prisma diye klasör açıp, schema.prisma dosyası oluşturalım ve içeriğini girelim:
Tüm tabolar bu tek dosya içerisinde oluşturulur*
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mongodb"
url = env("DATABASE_URL")
}
model User {
id String @id @default(auto()) @map("_id") @test.ObjectId
username String
email String @unique
createdAt DateTime @default(now())
}
provider yerini mysql veya postresql olarak değişebilirsiniz.
Prisma tipleri:
String
Int
Float
Boolean
DateTime
Json
Bytes
BigInt
UUID @default(uuid())
Prisma dekoratörleri:
@id // biricil anahtar tanımlar
@id @default(autoincrement()) // otomatik id attırır
@default() // default değer alır @default(now()) gibi
@unique // eşsiz benzersiz yapar
@updatedAt // updateleme anı
Prisma tablo ilişkileri /@relation:
POST SCHEMA:
user User @relation(fields: [userId], references: [id])
fields: [userId]:
/* Bu, Post modelinde userId adlı bir alanın olduğunu
ve bu alanın User modelindeki bir kaydı işaret ettiğini belirtir. */
references: [id]: /* userId alanının User modelinde id
adlı alanı işaret ettiğini tanımlar.
Yani, Post modelindeki userId değeri User modelinde benzersiz bir id
ile eşleşir.
*/
UserSchema:
posts Post[]
Prisma enum kullanma:
enum Role {
USER
ADMIN
MODERATOR
}
model User {
id Int @id @default(autoincrement())
role Role
}
Prisma özel alanlar:
nickname String? // işaretlenir ve bu alanların isteğe bağlı olduğunu belirtir.
tags String[] // bir alanın bir dizi veri saklayabileceğini belirtir.
firstName String @map("first_name") /* Veritabanında farklı bir adla
saklamak istediğiniz alanları maplemek için kullanılır. */
@index, @unique /* ile Birden Fazla Alana İndeks
veya Benzersizlik Kısıtlamaları Eklemek: */
@@index([email, phoneNumber])
@@unique([username, email])
Prisma Bağlanmak:
const { PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient()
prisma.$disconnect() // bağlantıyı kapat
Bir kullanıcı yaratma:
await prisma.user.create({
data: {
username: "burakbehlull",
email: "burakbehlul@gmail.com",
}
})
Kullanıcı silme:
await prisma.user.delete({
where: {
id: 1,
}
})
Kullanıcıyı güncelleme:
await prisma.user.delete({
where: {
id: 1,
}
})
Çoklu güncelleme:
const updatedUsers = await prisma.user.updateMany({
where: {
status: "aktif değil",
},
data: {
status: "aktif",
},
})
Çok silme:
const deletedUsers = await prisma.user.deleteMany({
where: {
status: "aktif değil",
}
})
Döküman toplam sayısı bulma:
const userCount = await prisma.user.count({
where: {
status: "active",
},
})
Upsert methodu, belirli bir kayıt yoksa yeni bir kayıt oluşturmak varsa güncellemek için kullanılır:
const upsertedUser = await prisma.user.upsert({
where: {
email: "burakbehlull@gmail.com",
},
update: {
username: "burakbehlull",
},
create: {
username: "burakbehlull",
email: "burakbehlull@gmail.com",
createdAt: new Date(),
},
})
Hangi veritabanını kullanırsanız kullanın, kullanıcı işlemleriyle ilgili methodlar aynı olacaktır.
Sadece şemada gireceğiz veri tiplerini düzgün giriniz. Mongodb veritabanı tipleriyle sql veritabanı tipleri hata verir.
İyi kodlamalar!
Yorumlar
Yorum Gönder