typeORM学习

1.什么是Entity?

Entity是一个类,被抽象映射为数据库的table,假如使用Mogodb数据库的话,那么就对应为collection。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* user.entity.ts */
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

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

@Column()
firstName: string;

@Column()
lastName: string;

@Column()
isActive: boolean;
}
/* 上面的代码相当于创建了一个名字叫user的table,包括有四个字段,其中id是自增字段 */

通常的,每一个Entity都必须得包含有columns以及relations,并且必须包含有一个primary column(如果使用mongodb的话那么就必须包含有ObjectId column)。一般应用中都会包含多个Entity,每个Entity都必须在connection options里面被注册相关连接实际数据库的事宜。

1
2
3
4
5
6
7
8
9
10
11
12
13
import { createConnection, Connection } from "typeorm";
import { User } from "./entity/user.entity"

const connection: Connection = await createConnection({
type: "mysql",
host: "localhost",
port: 3306,
username: "USER_NAME",
password: "PASSWORD",
database: "DATABASE_NAME",
entities: [User], // 一个table的配置
// entities: ["entity/*.ts"], 或者这样写,配置整个目录下面的entity文件
});

前面也提到了Entity是一个装饰类,Entity能够接受可选的参数作为对table的配置,比如table的name,如下所示:

1
2
@Entity("users")
export class User {}

上面就是创建一个叫做名字叫做users的table,更具体的,一些常见的配置如下所示:

1
2
3
4
5
6
7
8
9
@Entity({
name: "users",
database: "DATA_BASE_NAME",
orderBy: {
name: "ASC",
id: "DESC"
}
})
export class User{}

既然table由columns组成,那么Entity也是由columns构成。@column装饰类将会把字段数据给映射成database table column。而column分为了很多种:primary columns;special columns;spatial columns。其中,任何一个entity都必须包含至少一个primary column,并且primary column又分为了下面几个部分:

  • PrimaryColumn:创建一个任意类型任意值的primary column,当然你也可以指出column的类型.
  • PrimaryGeneratedColumn:自动创建一个自增的int类型的primary column。在保存之前我们无需对他手动赋值,他会被自动生成。
  • PrimaryGeneratedColumn(“uuid”):自动创建一个独一无二的string类型的primary column,保存之前无需手动赋值,会被自动生成。
1
2
3
4
5
6
7
8
9
10
11
@Entity()
export class User {
@PrimaryColumn()
id: number;

@PrimaryGeneratedColumn()
addId: number;

@PrimaryGeneratedColumn("uuid")
userUuid: string
}

2.typeORM之@nestjs/typeorm基本介绍

要想在nestjs项目中使用typeORM的话,第一步至少需要安装@nestjs/typeorm typeorm以及database的npm包(比如mysql package),第二步就是在整个应用的根模块中import我们这个TypeOrmModule,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// app.module.js
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
imports: [
TypeOrmModule.forRoot([
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'test',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true
])
]
})
export class ApplicationModule {}

forRoot方法是用来干嘛用的?它就好比typeORM的createConnection()方法一样,并且他们之间所接受的参数格式也是一模一样的,如果参数为空的话,那么配置参数将会从根目录中的ormconfig.json里面读取。forRoot对象里面各个参数的意义如下所示:

  • 1.type:数据库类型,可选值有,”mysql”, “postgres”, “mariadb”, “sqlite”, “cordova”, “nativescript”, “oracle”, “mssql”, “mongodb”, “sqljs”, “react-native”,必选字段;
  • 2.name:连接名,默认名是”default”,每个连接的名字必须唯一。连接名在哪里会用上?比如getConnection(name: string)以及ConnectionManager.get(name: string)中;
  • 3.synchronize: 开发过程可用来debug,生产过程严禁使用,否则容易造成数据库数据丢失;
  • 4.entities: 被加载进来以及进行使用的数据库建模文件;可使用正则匹配。
  • 5.其他配置参数可参考typeORM官方文档。

之前还提到了ormconfig.json配置,形如下面:

1
2
3
4
5
6
7
8
9
10
{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "root",
"database": "test",
"entities": ["src/**/**.entity{.ts,.js}"],
"synchronize": true
}

在使用了ormconfig.json配置后,那么forRoot方法便可以接受一个空对象作为参数了。如下面所示:

··