TypeORM - 实体


实体是字段和关联数据库操作的集合。它用于将数据库表及其字段与实体及其属性进行映射。本章详细解释了 TypeORM 实体。

介绍

让我们在代码中创建一个简单的实体类。移动到项目根位置并进入 src 文件夹并移动到实体文件夹。现在,创建一个 TypeScript 文件 Student.ts 并输入以下代码 -

学生.ts

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

@Entity() 
export class Student {   

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

这里,

  • Entity()装饰器类用于表示Student类是一个实体。
  • PrimaryGenerateColumn()装饰器类用于表示 id 列是Student实体的主键列。
  • Column()装饰器类用于表示其他列,例如学生实体的姓名年龄

现在,实体类Student已创建。TypeORM 会自动生成一个与我们数据库中的Student实体对应的表,并将其命名为Student。现在,移至src/index.ts文件并添加以下代码 -

索引.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

这将在屏幕上返回以下输出 -

输出

插入

打开mysql服务器,将学生表添加到数据库中。

学生桌

正如前面所了解的,实体实际上是属性的集合。作为实体对象指的是数据库表。它的属性/成员变量引用相应的数据库表的字段/列。TypeORM通过Column类支持所有类型的数据库字段。让我们在本章中了解 TypeORM 支持的不同类型的列。

@Column()装饰器类用于表示实体中的列及其类型。

例如,学生实体的年龄属性和年龄属性的类型可以定义如下 -

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

这里,

  • 年龄是实体的属性。换句话说,年龄是数据库中学生表中的一个字段/列。
  • int表示数据库中年龄列的类型。

TypeORM 支持流行数据库引擎中几乎所有可用的类型。实际上,TypeORM 为每个数据库引擎启用不同的类型集。我们可以使用我们的数据库引擎支持的任何数据库类型,没有任何问题。

例如,postgresql 数据库引擎的 TypeORM 支持的类型如下 -

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 提供了除类型之外的一组广泛的选项来描述列。例如,长度选项是指数据库字段的长度,可以指定如下 -

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

一些最常见的列选项如下 -

  • name - 数据库字段/列的名称。
  • length - 数据库字段/列的长度。
  • nullable - 指定数据库字段/列是否允许为空。
  • default - 数据库字段/列的默认值。
  • Primary - 指定数据库字段/列是否是表的主键。
  • unique - 指定数据库字段/列是否唯一
  • *精度** - 数据库字段/列的精度
  • 规模- 数据库字段/列的规模
  • comment - 数据库字段/列的注释或描述

@生成的装饰器

TypeORM 提供了额外的装饰器 @Generate 来自动生成列值。例如,通用唯一标识符(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; 
}

@PrimaryGenerateColumn()

@PrimaryGenerateColumn()字段用于指定主列以及在数据库中自动生成列值。如下所示 -

import {Entity, PrimaryGeneratedColumn} from "typeorm"; 

@Entity() 
export class Student {

   @PrimaryGeneratedColumn() 
   id: number;
}

这里,

您不必分配 id 值;它将由数据库表中的TypeORM自动生成。

@PrimaryGenerateColumn(“uuid”)

@PrimaryGenerateColumn 还接受一个参数来指定生成器的类型。主要用途之一是根据 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[]; 
}

simple-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中定义为,

索引.ts

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

专题栏目

TypeORM支持以下特殊列

  • @CreateDateColumn - 这是一个特殊的列,用于自动设置实体的插入日期。
  • @UpdateDateColumn - 用于自动设置实体的更新时间。
  • @VersionColumn - 自动设置实体的版本号。

实体继承

实体继承用于减少实体的重复。考虑以下实体 -

结果.ts

@Entity() 
export class Result {    

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

等级.ts

Grade.ts 的代码如下 -

@Entity() 
export class Grade {

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

这里,

上面两个实体有 id、标题和描述列。使用实体继承,我们创建一个基类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; 
}

现在启动您的服务器,您可以看到以下响应,

传输流节点

现在打开你的mysql服务器并移动到你的数据库,你可以看到下表,

数据库服务器

等级表

等级表

结果表

结果表