Object-Relational Mapper (ORM), Object-Relational mapping tekniğini uygulayan bir kitaplıktır. Bu, tercih ettiğiniz dilin nesne yönelimli paradigmasını kullanarak SQL veritabanı sorguları yazmanıza olanak tanır.
TypeORM, çeşitli veritabanlarıyla arabirim oluşturmayı çok kolaylaştıran bir TypeScript ORM’dir. SQL veritabanlarıyla çalışır, ancak MongoDB gibi NoSQL veritabanlarıyla da güzel bir şekilde arabirim oluşturur.
NestJS, kullanıma hazır TypeORM için üst düzey destek sağlar. Özel TypeORM paketi, entegrasyonu nispeten kolaylaştırır.
1. Adım: Bağımlılıkları Yükleme
TypeORM’yi bir NestJS uygulamasında kullanmadan önce, yerel NestJS paketi ve tercih ettiğiniz SQL veritabanı ile yüklemeniz gerekir. SQLite basit, kurulum gerektirmeyen bir seçenektir.
npm paket yöneticisini kullanarak TypeORM’yi ve yerel NestJS paketini yüklemek için aşağıdaki komutu çalıştırın :
npm install @nestjs/typeorm typeorm
SQLite’ı yüklemek için aşağıdaki komutu çalıştırın:
npm install sqlite3
2. Adım: Bir Varlık Oluşturma
Bir varlık, bir veritabanında depolanan verileri tanımlayan bir alanlar koleksiyonudur. TypeORM, veritabanınızda bir tablo oluşturmak için varlık dosyasını kullanır.
Bir varlık oluşturmak için aşağıdaki adımları izleyin:
Uygulama modülünüzde bir dosya oluşturun ve onu NestJS adlandırma kuralına ( <name>.entity.ts ) göre adlandırın.
Varlık dosyanızda typeorm’dan Entity , Column ve PrimaryGeneratedColumn dekoratörlerini içe aktarın .
Varlık dosyanızda bir sınıf oluşturun ve dışa aktarın.
Sınıfı, veritabanınızda olmasını istediğiniz id , name vb. değerlerle doldurun.
Varlık sınıfınıza Varlık dekoratörü ile açıklama ekleyin. Bu, sınıfınızın TypeORM tarafından bir varlık olarak tanınmasını sağlar.
id özelliğinize PrimaryGeneratedColumn dekoratörü ile açıklama ekleyin. Bu, TypeORM’ye kimliği birincil anahtar olarak işaretlemesini ve otomatik olarak artırmasını söyler.
Kalan özellikleri Sütun dekoratörü ile açıklayın. Bu, onları veritabanınıza sütunlar olarak ekler.
Örneğin:
// src/test/test.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from ‘typeorm’;
@Entity()
export class Test {
@PrimaryGeneratedColumn()
id: number;
@Column()
property_1: string;
@Column()
property_2: string;
@Column()
property_3: string;
}
Yukarıdaki varlık dosyası, veritabanınızda bu tabloyu oluşturur:
Ölçek
İD
int(11)
BİRİNCİL ANAHTAR AUTO_INCREMENT
özellik_1
değişken(255)
özellik_2
değişken(255)
özellik_3
değişken(255)
TypeORM belgeleri varlıkları daha ayrıntılı olarak kapsar.
3. Adım: Uygulamanızı Bir Veritabanına Bağlama
Artık varlığınız kurulduğuna göre, uygulamanızı bir veritabanına bağlamanız gerekir. Bu örnek SQLite kullanır.
Uygulamanızı bir veritabanına bağlamak için aşağıdaki adımları izleyin:
Uygulamalarınızın kök modülünde (Genellikle app.module.ts dosyası), TypeOrmModule öğesini @nestjs/typeorm adresinden içe aktarın .
Aynı dosyada, tüm varlıklarınızı içe aktarın.
imports dizisinde, TypeOrmModule’de forRoot yöntemini çağırın. forRoot yöntemi, veritabanı bağlantısını uygulamanızdaki tüm modüller aracılığıyla paylaşır.
Boş bir nesneyi argüman olarak forRoot yöntemine iletin; bu, TypeORM yapılandırma nesnesi olacaktır.
Yapılandırma nesnesine bir özellik ekleyin, yazın ve bunu “sqlite” olarak ayarlayın . type özelliği, kullanmakta olduğunuz veritabanının adını belirtir.
Yapılandırma nesnesine başka bir özellik olan database ekleyin ve bunu “test.db” olarak ayarlayın . database özelliği, veritabanınız için tercih ettiğiniz adı belirtir.
Yapılandırma nesnesine başka bir özellik olan entity’leri ekleyin ve onu boş bir diziye ayarlayın. Boş diziyi daha önce içe aktardığınız varlıklarla doldurun.
Başka bir özellik ekleyin, senkronize edin ve bunu true olarak ayarlayın ; bu özellik, varlıklarınızı veritabanınızla eşitler ve kodu her çalıştırdığınızda günceller. Geliştirme sırasında bu özelliği yalnızca true olarak ayarlamalısınız. Üretim sırasında, veri kaybını önlemek için bunu false olarak ayarlamalısınız.
// src/app.module.ts
import { Module } from ‘@nestjs/common’;
import { TypeOrmModule } from ‘@nestjs/typeorm’;
import { Test } from ‘./test/test.entity’;
import { Entity2 } from ‘./entity/entity.entity’;
import { TestModule } from ‘./test/test.module’;
@Module({
imports: [
TypeOrmModule.forRoot({
type: ‘sqlite’,
database: ‘test.db’,
entities: [Test, Entity2],
synchronize: true, //development only
}),
TestModule,
],
controllers: [],
providers: [],
})
export class AppModule {}
4. Adım: Depo Oluşturma
Havuz, bir varlığın veri tabanında varlık tarafından oluşturulan bir tablo üzerinde sorgulamalar (ekleme, silme, kaydetme, bulma vb.) yapmak için kullanılan erişim katmanıdır. TypeORM, havuz tasarım modelini destekler, dolayısıyla her varlığın kendi deposu vardır.
Aşağıdaki adımları uyguladığınızda TypeORM, varlığınız için otomatik olarak bir havuz oluşturur:
Varlığınızın modül dosyasında, @ nestjs/typeorm’dan TypeOrmModule’ü içe aktarın ve varlığınızı içe aktarın.
@Module dekoratöründe bir import dizisi oluşturun.
imports dizisinde, TypeOrmModule’de forFeature yöntemini çağırın.
Kendinize bir argüman olarak bir dizi iletin ve diziyi varlığınızla doldurun.
// src/test/test.module.ts
import { Module } from ‘@nestjs/common’;
import { TypeOrmModule } from ‘@nestjs/typeorm’;
import { TestController } from ‘./test.controller’;
import { TestService } from ‘./test.service’;
import { Test } from ‘./test.entity’;
@Module({
imports: [TypeOrmModule.forFeature([Test])],
providers: [TestService],
controllers: [TestController],
})
Adım 5: Bağımlılık Enjeksiyonunu Kullanarak Deponuzu Hizmetine Ekleme
Bağımlılık enjeksiyonu, kontrol ilkesinin tersine çevrilmesinin bir biçimi olan bir yazılım mühendisliği tekniğidir. Bağımlılık yönetiminin yükünü istemci kodundan bağlı olduğu kitaplığa veya hizmete kaydırır.
Deponuzu bir hizmete enjekte etmek için aşağıdaki adımları izleyin:
Hizmet dosyanızda, typeorm’dan Depoyu ve @ nestjs/typeorm’dan InjectRepository dekoratörünü içe aktarın . Ayrıca deposunu enjekte etmek istediğiniz varlığı içe aktarın.
Hizmet sınıfınızda bir oluşturucu oluşturun .
Repo adlı özel bir değişkeni, onu başlatmak için yapıcıda bir parametre olarak bildirin.
Varlığınızın genel bir türüyle depolanacak bir Havuz türü atayın.
InjectRepository dekoratörü ile depoya açıklama ekleyin ve varlığınızı bir bağımsız değişken olarak iletin.
// test.service.ts
import { Injectable } from ‘@nestjs/common’;
import { Repository } from ‘typeorm’;
import { InjectRepository } from ‘@nestjs/typeorm’;
import { Test } from ‘./test.entity’;
@Injectable()
export class TestService {
constructor(
@InjectRepository(Test)
private repo: Repository<Test>,
) {}
}
Artık kurulumunuz tamamlandığına göre, verileri almak veya değiştirmek için üzerinde SQL sorguları yapabilirsiniz .
TypeORM ile SQL Sorguları Yapmak
Hizmet sınıfınızın içindeki repo değişkeninde TypeORM’nin depo yöntemlerini çağırarak herhangi bir basit SQL sorgusu yapabilirsiniz . TypeORM’nin sorgu oluşturucusunu kullanarak karmaşık SQL sorguları da oluşturabilirsiniz.