Object-Relational Mapper (ORM) to biblioteka implementująca technikę mapowania obiektowo-relacyjnego. Pozwala to na pisanie zapytań do bazy danych SQL przy użyciu zorientowanego obiektowo paradygmatu preferowanego języka.
TypeORM to TypeScript ORM, który bardzo ułatwia łączenie się z różnymi bazami danych. Działa z bazami danych SQL, ale także ładnie współpracuje z bazami danych NoSQL, takimi jak MongoDB.
NestJS zapewnia obsługę wysokiego poziomu dla TypeORM po wyjęciu z pudełka. Dedykowany pakiet TypeORM sprawia, że integracja jest stosunkowo łatwa.
Krok 1: Instalowanie zależności
Przed użyciem TypeORM w aplikacji NestJS, musisz zainstalować go z jego natywnym pakietem NestJS i preferowaną bazą danych SQL. SQLite to prosta, bezinstalacyjna opcja.
Uruchom następujące polecenie, aby zainstalować TypeORM i jego natywny pakiet NestJS, używając menedżer pakietów npm:
instalacja npm @nestjs/typorma typormy
Uruchom następujące polecenie, aby zainstalować SQLite:
npm zainstalować sqlite3
Krok 2: Tworzenie podmiotu
Encja to zbiór pól definiujących dane przechowywane w bazie danych. TypeORM używa pliku encji do utworzenia tabeli w Twojej bazie danych.
Wykonaj poniższe czynności, aby utworzyć encję:
- Utwórz plik w swoim module aplikacji i nazwij go zgodnie z konwencją nazewnictwa NestJS (
.podmiot.ts ). - W pliku podmiotu zaimportuj Podmiot, Kolumna, oraz Podstawowa generowana kolumna dekoratorzy z typorma.
- W pliku encji utwórz i wyeksportuj klasę.
- Wypełnij klasę wartościami, które chcesz umieścić w swojej bazie danych, na przykład ID, Nazwaitp.
- Dodaj adnotację do swojej klasy encji za pomocą dekoratora Entity. To sprawia, że Twoja klasa jest rozpoznawalna przez TypeORM jako jednostka.
- Dodaj adnotację do swojej właściwości id za pomocą dekoratora PrimaryGeneratedColumn. To mówi TypeORM, aby zaznaczyć ID jako klucz podstawowy i automatycznie go zwiększaj.
- Opisz pozostałe właściwości za pomocą dekoratora kolumn. To dodaje je jako kolumny w Twojej bazie danych.
Na przykład:
// src/test/test.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } z „typorma”;@Podmiot()
eksportklasaTest{
@PrimarygeneratedColumn()
numer identyfikacyjny;@Kolumna()
właściwość_1: ciąg;@Kolumna()
właściwość_2: ciąg;
@Kolumna()
właściwość_3: ciąg;
}
Powyższy plik encji tworzy tę tabelę w Twojej bazie danych:
test | ||
---|---|---|
ID | wewn (11) | KLUCZ PODSTAWOWY AUTO_INCREMENT |
właściwość_1 | warchar (255) | |
właściwość_2 | warchar (255) | |
właściwość_3 | warchar (255) |
The Dokumentacja typu ORM obejmuje podmioty bardziej szczegółowo.
Krok 3: Łączenie aplikacji z bazą danych
Teraz, gdy Twoja jednostka jest już skonfigurowana, musisz połączyć swoją aplikację z bazą danych. W tym przykładzie użyto SQLite.
Wykonaj poniższe czynności, aby połączyć aplikację z bazą danych:
- W module głównym aplikacji (zwykle app.moduł.ts plik), importuj TypOrmModuł z @nestjs/typeorm.
- W tym samym pliku zaimportuj wszystkie swoje encje.
- w import tablica, zadzwoń do dla root metoda na TypeOrmModule. Metoda forRoot współdzieli połączenie z bazą danych przez wszystkie moduły w aplikacji.
- Przekaż pusty obiekt jako argument do metody forRoot; będzie to obiekt konfiguracyjny TypeORM.
- Dodaj nieruchomość, rodzaj, do obiektu konfiguracyjnego i ustaw go na „sqlite”. Właściwość type oznacza nazwę używanej bazy danych.
- Dodaj kolejną właściwość, Baza danych, do obiektu konfiguracyjnego i ustaw go na „test.db”. Właściwość bazy danych oznacza preferowaną nazwę bazy danych.
- Dodaj kolejną właściwość, podmioty, do obiektu konfiguracyjnego i ustaw go na pustą tablicę. Wypełnij pustą tablicę encjami, które zaimportowałeś wcześniej.
- Dodaj kolejną właściwość, synchronizowaći ustaw go PRAWDA; ta właściwość synchronizuje twoje jednostki z bazą danych i aktualizuje ją za każdym razem, gdy uruchamiasz kod. Powinieneś ustawić tę właściwość tylko na PRAWDA w rozwoju. Podczas produkcji należy ustawić go na fałszywy aby uniknąć utraty danych.
// src/app.module.ts
import { Moduł } z '@nestjs/wspólne';
import { TypeOrmModuł } z '@nestjs/typeorm';
import { Test } z „./test/test.jednostka”;
import { Jednostka2 } z „./podmiot/podmiot.podmiot”;
import { Moduł testowy } z './test/test.moduł';
@Moduł({
import: [
TypOrmModuł.dla roota({
rodzaj: 'sqlite',
Baza danych: 'test.db',
podmioty: [Test, podmiot2],
synchronizować: PRAWDA, //tylko rozwój
}),
Moduł testowy,
],
kontrolerzy: [],
dostawcy: [],
})
eksportklasaModuł aplikacji{}
Krok 4: Tworzenie repozytorium
Repozytorium to warstwa dostępu encji używana do wykonywania zapytań (wstawiania, usuwania, zapisywania, wyszukiwania itp.) w tabeli utworzonej przez encję w bazie danych. TypeORM obsługuje wzorzec projektowy repozytorium, dlatego każda jednostka ma swoje własne repozytorium.
TypeORM automatycznie tworzy repozytorium dla Twojej encji po wykonaniu poniższych kroków:
- W pliku modułu swojej jednostki zaimportuj TypOrmModuł z @nestjs/typeorm i zaimportuj swój podmiot.
- Stworzyć import tablica w @Moduł dekorator.
- W tablicy importów wywołaj dla funkcji metoda na TypeOrmModule.
- Przekaż tablicę jako argument do swojego i wypełnij tablicę swoją jednostką.
// src/test/test.module.ts
import { Moduł } z '@nestjs/wspólne';
import { TypeOrmModuł } z '@nestjs/typeorm';
import { Kontroler Testów } z './test.kontroler';
import { Usługa testowa } z './usługa.testowa';
import { Test } z „./podmiot.testowy”;
@Moduł({
import: [TypeOrmModule.forFeature([Test])],
dostawcy: [Usługa testowa],
kontrolerzy: [Kontroler Testów],
})
Krok 5: Wstrzyknięcie repozytorium do jego usługi za pomocą wstrzykiwania zależności
Wstrzykiwanie zależności to technika inżynierii oprogramowania, która jest formą odwrócenia zasady sterowania. Przenosi ciężar zarządzania zależnościami z kodu klienta na bibliotekę lub usługę, od której zależy.
Wykonaj poniższe czynności, aby wstrzyknąć swoje repozytorium do usługi:
- W pliku usługi zaimportuj Magazyn z typorma i InjectRepository dekorator z @nestjs/typeorm. Zaimportuj również encję, którą chcesz wstrzyknąć do jej repozytorium.
- W swojej klasie usług utwórz konstruktor.
- Zadeklaruj prywatny zmienny, repozytorium, jako parametr w konstruktorze, aby go zainicjować.
- Przypisz typ repozytorium do repozytorium z ogólnym typem twojej encji.
- Opisz repozytorium za pomocą dekoratora InjectRepository i przekaż swoją jednostkę jako argument.
// test.usługa.ts
import { do wstrzykiwania } z '@nestjs/wspólne';
import { Repozytorium } z „typorma”;
import { InjectRepository } z '@nestjs/typeorm';
import { Test } z „./podmiot.testowy”;
@do wstrzykiwania()
eksportklasaUsługa testowa{
konstruktor(
@InjectRepository(Test)
prywatne repozytorium: Repozytorium<Test>,
) {}
}
Teraz, gdy konfiguracja jest zakończona, możesz zrobić Zapytania SQL na nim, aby pobrać lub zmodyfikować dane.
Wykonywanie zapytań SQL z TypeORM
Możesz wykonać dowolne proste zapytanie SQL, wywołując metody repozytorium TypeORM na repozytorium zmienna wewnątrz Twojej klasy usług. Możesz także tworzyć złożone zapytania SQL za pomocą konstruktora zapytań TypeORM.