2018年12月份,typeorm作者 pleerock 对于typeorm 0.4.0 版本的构想深受用户抵制,包含了很多破坏性变更,于是原地搁浅,三年后的今天,构想中的一部分功能终于得以实现,即将合并入主干分支 0.3.0 ,其中包含了一些0.4.0提到的api变更,nodejs版本 es版本提升,
新增的功能虽然不多,但是非常有用,都是社区期待已久的功能,
1. find relation 支持条件查询
在之前的版本中,我们在find的时候可以通过relation属性join我们想要查询的关联表
userRepository.find({
relations: ["contacts", "photos", "photos.album"]
})
但是尴尬的是,我们无法在relation的表中增加过滤条件,面对这样的过滤条件,只能使用querybuilder
github issue,新的版本,终于实现了这个功能,
userRepository.find({
where: {
photos: {
album: {
name: "profile"
}
}
}
})
并且,在select属性中,也支持了relation的部分字段选择
userRepository.find({
select: {
id: true,
firstName: true,
lastName: true,
photo: {
id: true,
filename: true,
album: {
id: true,
name: true,
}
}
}
})
还支持了 relation中字段的 order条件
userRepository.find({
order: {
photos: {
album: {
name: "ASC"
},
},
}
})
终于弥补了相对于prisma的功能缺失,用起来更加方便了
2. relation查询支持join或者query两种选项
join不多说了,原来就是这个样子,新增了query的选项,,通过多个查询完成之前的join操作。在数据量很大时,能明显的提升性能
新增无了
虽然东西不是很多,但是在typeorm作者多次重申自己已无力全职维护,号召大家捐款的情况下,有这么大的产出,也确实不容易了,作者曾在置顶issue中提到,如果每个月能有10000美刀的捐款,那么他将会全职维护typeorm,如今三年过去了,据笔者统计,typeorm在opencollective中每个月获得的捐款还不足2000美元,距离目标还有较大距离,笔者能力有限,贡献了几十美刀然而也是杯水车薪,希望将来能有大的公司提供长期捐助。
像 nestjs ,每个月大约有8000美刀的收入,捐赠的大公司甚至有redhat
,
各位能帮衬的帮衬一下吧... opencollective
那么现在typeorm还缺什么呢
据笔者观察使用,在终于支持了relation条件查询,relation嵌套select,深层order的情况下,,typeorm还缺的可能就是save时的避免二次查询option了。
想象一下我们正常的一个curd请求,前端传来 primaryId 我们肯定会先数据库查询校验一次,然后修改一下,然后再保存,使用typeorm,逻辑非常清晰简单。。
public async setOrderCompleted(id: number) {
const order = await this.orderRepository.findOne(id);
if (!order) {
throw new HttpException(`no order of ${id}`, 400);
}
order.orderStatus = OrderStatus.review;
order.completedTime = new Date();
return this.orderRepository.save(order, {reload: false});
}
然而,现在typeorm中的问题是,在save时会重复进行一次select,,来判断save真正要执行的是 insert 还是 update
Request...
/api/order/set_order_completed
query: SELECT `Order`.`id` AS `Order_id`, `Order`.`orderCode` AS `Order_orderCode`, `Order`.`email` AS `Order_email`, `Order`.`transMoney` AS `Order_transMoney`, `Order`.`payType` AS `Order_payType`, `Order`.`payTime` AS `Order_payTime`, `Order`.`payMoney` AS `Order_payMoney`, `Order`.`completedTime` AS `Order_completedTime`, `Order`.`orderStatus` AS `Order_orderStatus`, `Order`.`captureId` AS `Order_captureId`, `Order`.`refundId` AS `Order_refundId`, `Order`.`isActive` AS `Order_isActive`, `Order`.`createTime` AS `Order_createTime`, `Order`.`updateTime` AS `Order_updateTime`, `Order`.`userId` AS `Order_userId`, `Order`.`orderAddressId` AS `Order_orderAddressId` FROM `order` `Order` WHERE `Order`.`id` IN (?) -- PARAMETERS: [21]
query: SELECT `Order`.`id` AS `Order_id`, `Order`.`orderCode` AS `Order_orderCode`, `Order`.`email` AS `Order_email`, `Order`.`transMoney` AS `Order_transMoney`, `Order`.`payType` AS `Order_payType`, `Order`.`payTime` AS `Order_payTime`, `Order`.`payMoney` AS `Order_payMoney`, `Order`.`completedTime` AS `Order_completedTime`, `Order`.`orderStatus` AS `Order_orderStatus`, `Order`.`captureId` AS `Order_captureId`, `Order`.`refundId` AS `Order_refundId`, `Order`.`isActive` AS `Order_isActive`, `Order`.`createTime` AS `Order_createTime`, `Order`.`updateTime` AS `Order_updateTime`, `Order`.`userId` AS `Order_userId`, `Order`.`orderAddressId` AS `Order_orderAddressId` FROM `order` `Order` WHERE `Order`.`id` IN (?) -- PARAMETERS: [21]
query: START TRANSACTION
query: UPDATE `order` SET `completedTime` = ?, `orderStatus` = ?, `updateTime` = CURRENT_TIMESTAMP WHERE `id` IN (?) -- PARAMETERS: ["2022-02-22T16:54:32.353Z",3,21]
query: COMMIT
明明我在判断实体是否存在时已经查询过了,save时完全可以不再查询,直接使用刚刚查询出来的就可以了,但是typeorm的save仍然会在查询一遍,对于性能强迫症患者来说,,很不友好,, 相关issue
micro-orm 很好的解决了这个问题,希望将来typeorm也能跟上。。
typeorm 因为nest集成度很高的原因,获得了大量nestjs用户的关注,作者仍然很努力的去维护他,prisma micro-orm 也吸引了很多用户,然而笔者还是比较推荐typeorm,因为 prisma的 schema 很怪异,micro-orm没有什么亮点。。
typeorm 已经有了完整的嵌套事务、乐观锁、数据迁移、数据模型同步等等必要性功能支持,而其他的小小的语法的易用性上面,可以慢慢的进行追逐。。在nestjs框架如日中天的今天,typeorm的受关注度只会越来越高,而不会越来越少。。