TypeORM - 實體



實體是欄位和關聯資料庫操作的集合。它用於將資料庫表及其欄位與實體及其屬性對映。本章詳細介紹了 TypeORM 實體。

介紹

讓我們在程式碼中建立一個簡單的實體類。移動到專案根目錄並進入 src 資料夾,然後移動到 entity 資料夾。現在,建立一個 TypeScript 檔案 Student.ts 並輸入以下程式碼 -

Student.ts

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm"; 

@Entity() 
export class Student {   

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   Name: string; 
   
   @Column() 
   age: number; 
}

這裡,

  • Entity() 裝飾器類用於表示Student類是一個實體。
  • PrimaryGeneratedColumn() 裝飾器類用於表示 id 列是Student實體的主鍵列。
  • Column() 裝飾器類用於表示其他列,例如Student實體的NameAge

現在,建立了實體類Student。TypeORM 將自動生成一個對應於我們資料庫中Student實體的表,並且它將被命名為student。現在,移動到src/index.ts檔案並新增以下程式碼 -

index.ts

import "reflect-metadata"; 
import {createConnection} from "typeorm";
import {Student} from "./entity/Student"; //import Student entity

createConnection().then(async connection => { 

   console.log("Inserting a new record into the student database..."); 
   
   //create student object const stud = new Student(); 
   
   //Assign student name and age here stud.Name = "student1"; 
   stud.age = 12; 
   
    //save student object in connection await connection.manager.save(stud); console.log("Saved a new user with id: " + stud.id);
    
    console.log("Loading users from the database...");

    //Display student saved records const students = await connection.manager.find(Student); console.log("Loaded users: ", students);

    console.log("Here you can setup and run express/koa/any other framework.");
}).catch(error => console.log(error));

這裡,

  • 第 1-3 行匯入相關類,createConnectionStudent
  • 第 5 行使用createConnection建立到資料庫的新連線,如果建立連線,則執行then塊中的程式碼。
  • 第 10 行建立一個新的 Student 物件,stud。
  • 第 13-14 行設定我們新建立的 stud 物件的屬性。
  • 第 17 行使用connection.manager物件中可用的 save 方法將實體儲存到資料庫。
  • 第 23 行使用connection.manager物件中可用的 find 方法從資料庫中獲取學生詳細資訊。

啟動 Mysql 伺服器並執行您的應用程式

我們建立了 Student 實體並在 index.ts 中建立了連線。讓我們同時啟動 MySql 伺服器和您的應用程式。

npm start

這將在您的螢幕上返回以下輸出 -

輸出

Inserting

開啟mysql伺服器,以下student表已新增到您的資料庫中。

Student Table

如前所述,實體實際上是屬性的集合。由於實體物件引用資料庫表。它的屬性/成員變數引用對應資料庫表的欄位/列。TypeORM 透過 Column 類支援所有型別的資料庫欄位。讓我們在本節中瞭解 TypeORM 支援的不同型別的列。

@Column()裝飾器類用於表示實體中的列及其型別。

例如,學生實體的 age 屬性和 age 屬性的型別可以定義如下 -

@Column("int") age: integer; // OR @Column({ type: "int" }) age: integer;

這裡,

  • age是實體的屬性。換句話說,age 是資料庫中 student 表中的一個欄位/列。
  • int表示資料庫中 age 列的型別。

TypeORM 支援流行的資料庫引擎中幾乎所有可用的型別。實際上,TypeORM 為每個資料庫引擎啟用不同的型別集。我們可以毫無問題地使用我們的資料庫引擎支援的任何資料庫型別。

例如,TypeORM 為 postgresql 資料庫引擎支援的型別如下 -

int, int2, int4, int8, smallint, integer, bigint, decimal, numeric, real, float, float4, float8, double precision, money, character varying,

varchar, character, char, text, citext, hstore, bytea, bit, varbit, bit

varying, timetz, timestamptz, timestamp, timestamp without time zone, timestamp with time zone, date, time, time without time zone, time with time zone, interval, bool, boolean, enum, point, line, lseg, box, path, polygon, circle, cidr, inet, macaddr, tsvector, tsquery, uuid, xml, json, jsonb, int4range, int8range, numrange, tsrange, tstzrange, daterange, geometry, geography, cube

同樣,TypeORM 支援 MySQL 的不同資料集型別。

列選項

除了型別之外,TypeORM 還提供了一組廣泛的選項來描述列。例如,length 選項指的是資料庫欄位的長度,它可以指定如下 -

@Column("varchar", { length: 100 })

一些最常見的列選項如下 -

  • name - 資料庫欄位/列的名稱。
  • length - 資料庫欄位/列的長度。
  • nullable - 指定資料庫欄位/列是否允許為空。
  • default - 資料庫欄位/列的預設值。
  • primary - 指定資料庫欄位/列是否是表的主鍵。
  • unique - 指定資料庫欄位/列是否唯一
  • *precision** - 資料庫欄位/列的精度
  • scale - 資料庫欄位/列的刻度
  • comment - 資料庫欄位/列的註釋或描述

@Generated 裝飾器

TypeORM 提供額外的裝飾器 @Generated 來自動生成列值。例如,通用唯一識別符號 (UUID) 在資料庫中非常常見,用於在列中儲存唯一值。生成 UUID 的示例程式碼如下 -

@Entity() 
export class Student {
 
   @PrimaryColumn() 
   id: number; 
   
   @Column() 
   @Generated("uuid") 
   uuid: string; 
}

這裡,

uuid自動生成並存儲在資料庫中。

主鍵列

資料庫中任何實體至少需要一個主鍵欄位。它被分類為不同型別的裝飾器。我們將逐一討論。

@PrimaryColumn()

@PrimaryColumn() 裝飾器用於為任何型別的資料建立主鍵列。簡單的示例如下所示,

import {Entity, PrimaryColumn} from "typeorm"; 

@Entity() 
export class Student {        
@PrimaryColumn() 
   id: number; 
}

這裡,

id是一個整數,它不接受重複值,但我們需要分配值。

如果情況需要,我們也可以為一個或多個欄位分配主鍵列。

示例

import {Entity, PrimaryColumn} from "typeorm"; 

@Entity() 
export class Student { 
   
   @PrimaryColumn() 
   id: number; 
   
   @PrimaryColumn() 
   email: string; 
   
   @PrimaryColumn() 
   phone: number; 
}

@PrimaryGeneratedColumn()

@PrimaryGeneratedColumn()欄位用於指定主鍵列以及自動生成資料庫中的列值。如下所示 -

import {Entity, PrimaryGeneratedColumn} from "typeorm"; 

@Entity() 
export class Student {

   @PrimaryGeneratedColumn() 
   id: number;
}

這裡,

您不必分配 id 值;它將由 TypeORM 在資料庫表中自動生成。

@PrimaryGeneratedColumn(“uuid”)

@PrimaryGeneratedColumn 還接受一個引數來指定生成器的型別。主要用途之一是基於 UUID 生成唯一 ID。

import {Entity, PrimaryGeneratedColumn} from "typeorm";

@Entity() 
export class Student {  
   @PrimaryGeneratedColumn("uuid") id: string; 
}

簡單陣列列型別

高階關係資料庫支援陣列資料型別。為了支援陣列資料型別,TypeORM 提供了一種特殊的列型別“simple-array”來儲存原始陣列值。使用它的示例程式碼如下 -

@Entity() 
export class Student { 
   
   @PrimaryGeneratedColumn() 
   id: number;

   @Column("simple-array") 
   names: string[]; 
}

簡單 JSON 列型別

許多現代資料庫引擎支援 JSON 資料庫。為了使用 JSON 資料型別,TypeORM 提供了一種特殊的型別 single-json。使用它的示例程式碼如下 -

@Entity() 
export class Student { 

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column("simple-json")
   info: { firstName: string, middleName: string, lastName: string }; 
}

此值可以在 index.ts 中定義為,

index.ts

const stud = new Student(); 
stud.info = { firstName: "John", middleName: "peter", lastName: "Michael" };

特殊列

TypeORM 支援以下特殊列

  • @CreateDateColumn - 它是一個特殊的列,用於自動設定實體的插入日期。
  • @UpdateDateColumn - 它用於自動設定實體的更新時間。
  • @VersionColumn - 自動為實體設定版本號。

實體繼承

實體繼承用於減少實體的重複。考慮以下實體 -

Result.ts

@Entity() 
export class Result {    

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   title: string; 
   
   @Column() 
   description: string; 
   
   @Column() 
   eligible: string 
}

Grade.ts

grade.ts 的程式碼如下 -

@Entity() 
export class Grade {

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   name: string; 
   
   @Column() 
   title: string; 
   
   @Column() 
   description: string;
   
   
   
   @Column() 
   grading : string; 
}

這裡,

以上兩個實體都有列 id、title 和 description。使用實體繼承,我們建立一個基類 Details 並將以上兩個實體組合如下所示。

Details.ts

export abstract class Details {

   @PrimaryGeneratedColumn() 
   id: number; 
   
   @Column() 
   title: string; 
   
   @Column() 
   description: string; 
} 
@Entity() 
export class Result extends Details{  

   @Column() 
   eligible: string 
} 
@Entity() 
export class Grade extends Details{   

   @Column() 
   name : string; 
   
   @Column() 
   grading : string; 
}

現在啟動您的伺服器,您將看到以下響應,

TS Node

現在開啟您的 mysql 伺服器並移動到您的資料庫,您將看到以下表,

Mysql Server

Grade 表

Grade table

Result 表

Result table
廣告

© . All rights reserved.