总结一下typeorm常用的使用方法
entity
主键
typeorm中,每个entity必须有主键
普通主键
1
2
3
4
5@Entity()
export class TunnelPart{
@PrimaryGeneratedColumn()
id: number;
}uuid主键
1
2
3
4
5@Entity()
export class BaseFileEntity {
@PrimaryGeneratedColumn("uuid")
id: string;
}这样的主键,就是uuid
多列主键
1
2
3
4
5
6
7
8@Entity()
export class StructureTeam {
@PrimaryColumn({ type: 'int' })
teamId: number;
@PrimaryColumn({ type: 'int' })
structureId: number;
}这样,就形成了一个有多列形成的主键
ManyToOne与oneToMany
ManyToOne 与 oneToMany是最常用的关系,两者可同时使用,ManyToOne可以单独使用,基本操作,如:保存、查询、级联删除等,放到后边下边来写,这里只写关系的建立
只建立ManyToOne
1 | @Entity() |
在ManyToOne的创建中,只提用一个参数即可,这个参数是一个箭头函数,指向One所对应的表
关系在建立的时候,可以指明一些参数,比如OnDetete,当用CASCADE
时,可以用作级联删除。
1 | @ManyToOne(type=>TunnelMethod, { onDelete: 'CASCADE' }) |
同时建立ManyToOne 与 OneToMany
1 | @Entity() |
1 | @Entity() |
在建立双向关系时,除了指明所在的entity,还要指明对方entity的属性
联合查询
relation查询
创建ManyToOne与OneToMany的关系以后,可以通过repository来查询
1 | @Entity() |
1 | const userRepository = connection.getRepository(User); |
也可以用createQueryBuilder形式
1 | const users = await connection |
一直觉得relations只在findOne中,可用,看了官网,发现都可以。
有些情况下,都是自己创建id字段来连接另外一个表使用,这种情况下,只能使用createQueryBuilder,查询出来的是地卡尔乘积的结果,有些情况下,需要经过去重处理。
这里要注意leftJoinAndSelect
与leftJoin
的区别。leftJoin不会查询出join表的字段
Raw查询
getRawMany()时,注意给列起别名,否则列名包括了表名。查询的数据不是entity时,采用raw方式查询。包括联表的自定义字段、SUM、COUNT等函数
1 | public async getMaterialList(subprojId:number, type?:string):Promise<Material[]>{ |
注意join都是迪卡尔积,会有重复。
OneToOne关系比较适合,不会用重复
区间查询
LessThan、MoreThan、Between
这里在repository中查询时,使用了以上区间函数;
同样可以使用createQueryBuilder的当时完成相同的操作。
1 | public async getMaterialPriceList(materialId:number, startDate?:string, endDate?:string){ |
用createQueryBuilder完成区间查询:
1 | public async getMaterialPriceList(materialId:number, startDate?:string, endDate?:string){ |
分页查询
同样是使用skip与take来完成
1 | const users = await getRepository(User) |
子查询
子查询是两个查询的嵌套,通常发生在where与from中
where中
1 | const posts = await connection.getRepository(Post) |
或者写成
1 | const userQb = await connection.getRepository(User) |
from中
1 | const posts = await connection |
from中的“user“是别名,或者写成
1 | const userQb = await connection.getRepository(User) |
全列查询
全表查询指的是对全部字段进行模糊查询,网上找资料看到一些方式,通过引入插件,再用函数的方式来实现,这样的实现在typeorm中很难实现。
列少时,可以考虑多列的模糊
select * from t where phonenum='digoal' or info ~ 'digoal' or c1='digoal'
将所有字段记录在1列中,从一列中查询
pgsql中使用::text
select * from structure where structure::text like %大河%
事务
1 | import {getManager} from "typeorm"; |
事物可以使用装饰器方式来书写:
1 | @Transaction() |
1 | @Transaction() |
可以在事务中指明隔离级别
migration
- 需要注意其ormconfig.json配置文件的书写
- 其原理是通过检测migration中的文件,来执行文件,并且在数据库中创建一个migrations的数据表,用来存储执行过的文件。在执行的时候,会对比文件夹中的文件与数据库执行过的文件,并选择new的进行执行。
- 这种方式需要看一个revert如果执行。
- migration其实是一种命令模式。