TypeORM
TypeORM 是 node.js
现有社区最成熟的对象关系映射器(ORM
)。本文介绍如何在 Midway 中使用 TypeORM 。
本模块是从 v3.4.0 开始为新版本,模块名有变化,历史写法部分兼容,如果查询历史文档,请参考 这里。
相关信息:
描述 | |
---|---|
可用于标准项目 | ✅ |
可用于 Serverless | ✅ |
可用于一体化 | ✅ |
包含独立主框架 | ❌ |
包含独立日志 | ❌ |
和老写法的区别
旧模块为 @midwayjs/orm
,新模块为 @midwayjs/typeorm
,区别如下:
- 1、包名不同
- 2、在
src/config.default
的部分配置调整- 2.1 配置文件中的 key 不同 (orm => typeorm)
- 2.2修改为数据源的形式
typeorm.dataSource
- 2.3 实体模型类或者实体模型类的路径,需要在数据源的
entities
字段中声明 - 2.4 Subscriber 需要在数据源的
subscribers
字段中声明
- 3、不再使用
EntityModel
装饰器,直接使用 typeorm 提供的能力
安装组件
安装 typeorm 组件,提供数据库 ORM 能力。
$ npm i @midwayjs/typeorm@3 typeorm --save
或者在 package.json
中增加如下依赖后,重新安装。
{
"dependencies": {
"@midwayjs/typeorm": "^3.0.0",
"typeorm": "~0.3.0",
// ...
},
"devDependencies": {
// ...
}
}
引入组件
在 src/configuration.ts
引入 orm 组件,示例如下。
// configuration.ts
import { Configuration } from '@midwayjs/core';
import * as orm from '@midwayjs/typeorm';
import { join } from 'path';
@Configuration({
imports: [
// ...
orm // 加载 typeorm 组件
],
importConfigs: [
join(__dirname, './config')
]
})
export class MainConfiguration {
}
安装数据库 Driver
常用数据库驱动如下,选择你对应连接的数据库类型安装:
# for MySQL or MariaDB,也可以使用 mysql2 替代
npm install mysql --save
npm install mysql2 --save
# for PostgreSQL or CockroachDB
npm install pg --save
# for SQLite
npm install sqlite3 --save
# for Microsoft SQL Server
npm install mssql --save
# for sql.js
npm install sql.js --save
# for Oracle
npm install oracledb --save
# for MongoDB(experimental)
npm install mongodb --save
- Oracle driver 比较特殊,需要查看 文档
- 不建议使用 typeorm 链接 mongodb,请使用 mongoose 组件
简单的目录结构
我们以一个简单的项目举例,其他结构请自行参考。
MyProject
├── src // TS 根目录
│ ├── config
│ │ └── config.default.ts // 应用配置文件
│ ├── entity // 实体(数据库 Model) 目录
│ │ └── photo.entity.ts // 实体文件
│ │ └── photoMetadata.entity.ts
│ ├── configuration.ts // Midway 配置文件
│ └── service // 其他的服务目录
├── .gitignore
├── package.json
├── README.md
└── tsconfig.json
在这里,我们的数据库实体主要放在 entity
目录(非强制),这只是一个简单的约定。
入门
下面,我们将以 mysql 举例。
1、创建 Model
我们通过模型和数据库关联,在应用中的模型就是数据库表,在 TypeORM 中,模型是和实体绑定的,每一个实体(Entity) 文件,即是 Model,也是实体(Entity)。
在示例中,需要一个实体,我们这里拿 photo
举例。新建 entity 目录,在其中添加实体文件 photo.entity.ts
,一个简单的实体如下。
// entity/photo.entity.ts
export class Photo {
id: number;
name: string;
description: string;
filename: string;
views: number;
isPublished: boolean;
}
要注意,这里的实体文件的每一个属性,其实是和数据库表一一对应的,基于现有的数据库表,我们往上添加内容。
2、定义实体模型
我们使用 Entity
来定义一个实体模型类。
// entity/photo.entity.ts
import { Entity } from 'typeorm';
@Entity('photo')
export class Photo {
id: number;
name: string;
description: string;
filename: string;
views: number;
isPublished: boolean;
}
如果表名和当前的实体名不同,可以在参数中指定。
// entity/photo.entity.ts
import { Entity } from 'typeorm';
@Entity('photo_table_name')
export class Photo {
id: number;
name: string;
description: string;
filename: string;
views: number;
isPublished: boolean;
}
这些实体列也可以使用 typeorm_generator 工具生成。
3、添加数据库列
通过 typeorm 提供的 @Column
装饰器来修饰属性,每一个属性对应一个列。
// entity/photo.entity.ts
import { Entity, Column } from 'typeorm';
@Entity()
export class Photo {
@Column()
id: number;
@Column()
name: string;
@Column()
description: string;
@Column()
filename: string;
@Column()
views: number;
@Column()
isPublished: boolean;
}
现在 id
, name
, description
,filename
, views
, isPublished
列将添加到 photo
表中。数据库中的列类型是根据您使用的属性类型推断出来的,例如 number 将转换为整数,将字符串转换为 varchar,将布尔值转换为 bool,等等。但是您可以通过在 @Column
装饰器中显式指定列类型来使用数据库支持的任何列类型。
我们生成了带有列的数据库表,但是还剩下一件事。每个数据库表必须具有带主键的列。
数据库列包括更多的列选项(ColumnOptions),比如修改列名,指定列类型,列长度等,更多的选项请参考 官方文档。