📅  最后修改于: 2020-10-19 03:40:29             🧑  作者: Mango
实体是字段和关联的数据库操作的集合。它用于将数据库表及其字段与实体及其属性进行映射。本章详细说明TypeORM实体。
让我们在代码中创建一个简单的Entity类。移至您的项目根目录,然后进入src文件夹并移至实体文件夹。现在,创建一个TypeScript文件Student.ts并输入以下代码-
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";
@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: number;
@Column()
Name: string;
@Column()
age: number;
}
这里,
现在,创建实体类Student 。 TypeORM将自动在我们的数据库中生成一个与Student实体相对应的表,并将其命名为student 。现在,移至src / 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));
这里,
我们已经创建了Student实体,并在index.ts中创建了连接。让我们同时启动MySql服务器和您的应用程序。
npm start
这将在屏幕上返回以下输出-
下面的学生表打开的mysql服务器被添加到您的数据库中。
如前所述,实体实际上是属性的集合。作为实体对象引用数据库表。其属性/成员变量引用相应数据库表的字段/列。 TypeORM通过Column类支持所有类型的数据库字段。让我们学习本章中TypeORM支持的不同类型的列。
@Column()装饰器类用于表示实体中的列及其类型。
例如,学生实体的年龄属性和年龄属性的类型可以定义如下-
@Column("int") age: integer; // OR @Column({ type: "int" }) age: integer;
这里,
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 })
一些最常见的列选项如下-
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()字段用于指定主列以及自动在数据库中生成列值。它显示如下-
import {Entity, PrimaryGeneratedColumn} from "typeorm";
@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: number;
}
这里,
您不必分配ID值;它会由TypeORM在数据库表中自动生成。
@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数据类型,TypeORM提供了一种特殊类型的single-json。使用它的示例代码如下-
@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: number;
@Column("simple-json")
info: { firstName: string, middleName: string, lastName: string };
}
该值可以在index.ts中定义为
const stud = new Student();
stud.info = { firstName: "John", middleName: "peter", lastName: "Michael" };
TypeORM支持以下特殊列
实体继承用于减少实体重复。考虑以下实体-
@Entity()
export class Result {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
description: string;
@Column()
eligible: string
}
grade.ts的代码如下-
@Entity()
export class Grade {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
title: string;
@Column()
description: string;
@Column()
grading : string;
}
这里,
以上两个实体具有列ID,标题和描述。使用实体继承,我们创建一个基类Details,并按以下指定的方式组合上述两个实体。
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服务器并移至您的数据库,您可以看到以下表格,