[DEV]AB 1
[DEV]AB
Sevdamsın 1
Sevdamsın
TuZaKK 1
TuZaKK
kaptanmikro1 1
kaptanmikro1
farkmt2official 2
farkmt2official
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Bvural41 1
Bvural41
Hikaye Ekle

[NODE JS] Prisma ORM Kurulumu ve Kullanımı

Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!

nodejs.png


[NODE JS] Prisma ORM Kurulumu ve Kullanımı​


Prisma, Node.js ve TypeScript dünyasında yeni nesil ORM olarak kendini kanıtlamış bir araç. Sequelize veya TypeORM gibi geleneksel ORM'lerden farklı olarak, Prisma kendi şema diliyle (Prisma Schema Language) çalışır ve veritabanı şemanızı tek bir dosyada tanımlamanıza olanak tanır. İlk kez kullandığımda beni en çok etkileyen şey, otomatik tamamlama ve tip güvenliği desteğiydi. TypeScript ile birlikte kullanıldığında, sorgu yazarken IDE'nin tüm alanları ve ilişkileri önermesi inanılmaz bir geliştirici deneyimi sunuyor.

Prisma üç ana bileşenden oluşur: Prisma Client (veritabanı sorgu oluşturucu), Prisma Migrate (migration aracı) ve Prisma Studio (görsel veritabanı yönetim aracı). Bu üç bileşen birlikte çalışarak veritabanı geliştirme sürecini uçtan uca kapsar. Prisma Studio'yu özellikle çok seviyorum çünkü tarayıcıda veritabanınızı görsel olarak incelemenize ve düzenlemenize olanak tanır.

Kurulum oldukça basit. npm install prisma --save-dev ve npm install @prisma/client komutlarıyla başlarsınız. npx prisma init komutu prisma/schema.prisma dosyasını ve .env dosyasını oluşturur. Şema dosyasında veritabanı bağlantı bilgileri, model tanımları ve ilişkiler yer alır.

Prisma Schema Language çok okunabilir bir dildir. Model tanımlarken alan adı, türü, kısıtlamalar ve ilişkiler net bir şekilde ifade edilir. @id, @unique, @default, @relation gibi dekoratörlerle alanların özelliklerini belirleriz. İlişkiler, ilişkili model türü ve @relation dekoratörüyle tanımlanır.

Prisma Migrate, şema değişikliklerini veritabanına uygulamak için kullanılır. npx prisma migrate dev komutuyla geliştirme ortamında, npx prisma migrate deploy komutuyla üretim ortamında migration'lar çalıştırılır. Her migration, SQL dosyaları olarak kaydedilir ve versiyon kontrolüne dahil edilir.

Prisma Client, şema dosyasından otomatik olarak üretilir. npx prisma generate komutuyla client güncellenir ve tüm modeller, alanlar ve ilişkiler için tip tanımları oluşturulur. Bu otomatik üretim, geliştirme sürecinde hata olasılığını minimuma indirir.

Performans açısından Prisma, sorguları optimize eder ve gereksiz veritabanı çağrılarını azaltır. Bağlantı havuzu yönetimi, sorgu önbellekleme ve akıllı ilişki yükleme gibi özellikler yerleşik olarak gelir. Ayrıca ham SQL sorguları çalıştırma imkânı da sunar, böylece Prisma'nın oluşturamadığı karmaşık sorgular için SQL'e dönebilirsiniz.

JavaScript:
// Prisma ORM Kurulumu ve Kullanımı

// ============================================
// prisma/schema.prisma - Şema dosyası
// ============================================
/*
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model Kullanici {
  id            Int       @id @default(autoincrement())
  email         String    @unique
  ad            String
  soyad         String
  sifre         String
  rol           Rol       @default(KULLANICI)
  aktif         Boolean   @default(true)
  profil        Profil?
  gonderiler    Gonderi[]
  yorumlar      Yorum[]
  olusturmaTarihi DateTime @default(now()) @map("olusturma_tarihi")
  guncellemeTarihi DateTime @updatedAt @map("guncelleme_tarihi")

  @@map("kullanicilar")
  @@index([email])
}

model Profil {
  id            Int       @id @default(autoincrement())
  biyografi     String?   @db.Text
  avatarUrl     String?   @map("avatar_url")
  websitesi     String?
  sehir         String?
  kullanici     Kullanici @relation(fields: [kullaniciId], references: [id], onDelete: Cascade)
  kullaniciId   Int       @unique @map("kullanici_id")

  @@map("profiller")
}

model Kategori {
  id            Int       @id @default(autoincrement())
  ad            String    @unique
  slug          String    @unique
  aciklama      String?
  gonderiler    Gonderi[]

  @@map("kategoriler")
}

model Gonderi {
  id            Int       @id @default(autoincrement())
  baslik        String
  slug          String    @unique
  icerik        String    @db.Text
  durum         GonderiDurumu @default(TASLAK)
  goruntuSayisi Int       @default(0) @map("goruntu_sayisi")
  yazar         Kullanici @relation(fields: [yazarId], references: [id])
  yazarId       Int       @map("yazar_id")
  kategori      Kategori? @relation(fields: [kategoriId], references: [id])
  kategoriId    Int?      @map("kategori_id")
  yorumlar      Yorum[]
  etiketler     GonderiEtiket[]
  yayinTarihi   DateTime? @map("yayin_tarihi")
  olusturmaTarihi DateTime @default(now())

  @@map("gonderiler")
  @@index([yazarId])
  @@index([kategoriId])
}

model Etiket {
  id            Int       @id @default(autoincrement())
  ad            String    @unique
  slug          String    @unique
  gonderiler    GonderiEtiket[]

  @@map("etiketler")
}

model GonderiEtiket {
  gonderi       Gonderi   @relation(fields: [gonderiId], references: [id], onDelete: Cascade)
  gonderiId     Int       @map("gonderi_id")
  etiket        Etiket    @relation(fields: [etiketId], references: [id], onDelete: Cascade)
  etiketId      Int       @map("etiket_id")

  @@id([gonderiId, etiketId])
  @@map("gonderi_etiketler")
}

model Yorum {
  id            Int       @id @default(autoincrement())
  icerik        String
  yazar         Kullanici @relation(fields: [yazarId], references: [id])
  yazarId       Int       @map("yazar_id")
  gonderi       Gonderi   @relation(fields: [gonderiId], references: [id], onDelete: Cascade)
  gonderiId     Int       @map("gonderi_id")
  onaylandi     Boolean   @default(false)
  olusturmaTarihi DateTime @default(now())

  @@map("yorumlar")
}

enum Rol {
  KULLANICI
  MODERATOR
  ADMIN
}

enum GonderiDurumu {
  TASLAK
  YAYINDA
  ARSIV
}
*/

// ============================================
// Prisma Client Kullanımı
// ============================================
const { PrismaClient } = require('@prisma/client');

const prisma = new PrismaClient({
  log: ['query', 'info', 'warn', 'error']
});

// Kullanıcı işlemleri
async function kullaniciIslemleri() {
  // Kullanıcı oluşturma (profil ile birlikte)
  const kullanici = await prisma.kullanici.create({
    data: {
      ad: 'Ece',
      soyad: 'Yıldırım',
      email: 'ece@ornek.com',
      sifre: 'hashlenmisSifre123',
      rol: 'ADMIN',
      profil: {
        create: {
          biyografi: 'Kıdemli yazılım geliştirici',
          sehir: 'İstanbul',
          websitesi: 'https://ece.dev'
        }
      }
    },
    include: {
      profil: true
    }
  });

  console.log('Kullanıcı oluşturuldu:', kullanici.ad, kullanici.soyad);
  console.log('Şehir:', kullanici.profil?.sehir);

  // Birden fazla kullanıcı oluşturma
  const kullaniciSayisi = await prisma.kullanici.createMany({
    data: [
      { ad: 'Ali', soyad: 'Kaya', email: 'ali@ornek.com', sifre: 'sifre123456' },
      { ad: 'Merve', soyad: 'Çelik', email: 'merve@ornek.com', sifre: 'sifre123456' },
      { ad: 'Onur', soyad: 'Şahin', email: 'onur@ornek.com', sifre: 'sifre123456' }
    ],
    skipDuplicates: true
  });
  console.log(`${kullaniciSayisi.count} kullanıcı oluşturuldu`);

  return kullanici;
}

// Gönderi ve ilişki işlemleri
async function gonderiIslemleri(yazarId) {
  // Kategori oluşturma
  const kategori = await prisma.kategori.create({
    data: {
      ad: 'Yazılım',
      slug: 'yazilim',
      aciklama: 'Yazılım geliştirme konuları'
    }
  });

  // Etiketler oluşturma
  await prisma.etiket.createMany({
    data: [
      { ad: 'JavaScript', slug: 'javascript' },
      { ad: 'TypeScript', slug: 'typescript' },
      { ad: 'Prisma', slug: 'prisma' }
    ]
  });

  // Gönderi oluşturma (ilişkilerle birlikte)
  const gonderi = await prisma.gonderi.create({
    data: {
      baslik: 'Prisma ORM Rehberi',
      slug: 'prisma-orm-rehberi',
      icerik: 'Prisma ile veritabanı işlemleri hakkında kapsamlı rehber...',
      durum: 'YAYINDA',
      yayinTarihi: new Date(),
      yazar: { connect: { id: yazarId } },
      kategori: { connect: { id: kategori.id } },
      etiketler: {
        create: [
          { etiket: { connect: { slug: 'javascript' } } },
          { etiket: { connect: { slug: 'prisma' } } }
        ]
      }
    },
    include: {
      yazar: { select: { ad: true, soyad: true } },
      kategori: true,
      etiketler: { include: { etiket: true } }
    }
  });

  console.log('
Gönderi oluşturuldu:', gonderi.baslik);
  console.log('Yazar:', gonderi.yazar.ad, gonderi.yazar.soyad);
  console.log('Etiketler:', gonderi.etiketler.map(e => e.etiket.ad).join(', '));

  return gonderi;
}

// Sorgu örnekleri
async function sorguOrnekleri() {
  // Filtreleme ve sayfalama
  const gonderiler = await prisma.gonderi.findMany({
    where: {
      durum: 'YAYINDA',
      yazar: {
        aktif: true
      }
    },
    include: {
      yazar: { select: { ad: true, soyad: true } },
      _count: { select: { yorumlar: true } }
    },
    orderBy: { olusturmaTarihi: 'desc' },
    take: 10,
    skip: 0
  });

  console.log('
Yayındaki gönderiler:');
  gonderiler.forEach(g => {
    console.log(`  - ${g.baslik} (${g._count.yorumlar} yorum)`);
  });

  // Gruplama ve toplama
  const istatistikler = await prisma.gonderi.groupBy({
    by: ['durum'],
    _count: { id: true },
    _avg: { goruntuSayisi: true }
  });

  console.log('
Gönderi istatistikleri:');
  istatistikler.forEach(i => {
    console.log(`  ${i.durum}: ${i._count.id} gönderi`);
  });
}

// Ana fonksiyon
async function main() {
  try {
    const kullanici = await kullaniciIslemleri();
    await gonderiIslemleri(kullanici.id);
    await sorguOrnekleri();
  } catch (hata) {
    console.error('Hata:', hata.message);
  } finally {
    await prisma.$disconnect();
  }
}

main();

Prisma ORM, modern Node.js ve TypeScript projelerinde veritabanı yönetimini son derece kolaylaştıran güçlü bir araçtır. Tip güvenliği, otomatik tamamlama desteği ve sezgisel şema dili ile geliştirici deneyimini üst seviyeye taşır. Özellikle TypeScript projelerinde Prisma kullanmak, derleme zamanında hataları yakalamak ve daha güvenli kod yazmak için mükemmel bir seçimdir.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst