在TypeORM中使用QueryBuilder与使用Repository有哪些不同的用例?

2022-03-04 00:00:00 database mysql nestjs typeorm

我正在使用NestJS和TypeORM构建API。我一直使用TypeORMRepository API查询MySQL数据库,主要是因为NestJS Database documentation section提供了一个使用this.photoRepository.find()的示例。随着时间的推移,我注意到我的许多探索性搜索结果出于性能和灵活性的原因推荐使用TypeORMQueryBuilder API。

我感觉到,如果我决定切换数据库框架,存储库方法更容易用于简单的需求和伟大的抽象。另一方面,在我看来,QueryBuilder的性能和可定制化程度也更高。

我们能概述一下TypeORM中QueryBuilder与存储库的不同用例吗?

SQL

QueryBuilder API非常强大,而且比Repository API更接近推荐答案,因此任何更复杂或更受SQL驱动的事情都可以通过它更轻松地完成。它是您在使用QueryRunner使用原始SQL之前的最后一个"工具",您可能不想每次都使用它(因为它使开发和重构时间更长)。

即使存储库更容易做,您也可能不希望代码库允许使用这2个API,因为它"拆分"了代码,但这完全取决于您的团队首选项。

存储库API更友好的地方在于获取关系,因为急切/延迟关系是从修饰符解析出来的,您不必指定"联接",而QueryBuilder暗示您显式地执行这些操作,否则它将只获取主表(它会忽略修饰符,SQL是第一公民)。

无论如何,即使您决定放弃Repository API或QueryBuilder API,我也强烈建议您始终可以在专用类(如自定义存储库或专用服务)中轻松找到您的查询,这样您就不会最终在代码库中到处维护查询,如果不加以控制,重构数据访问是危险的。例如,我个人发现Repository API上的"find"方法太强大了,并且不允许在专用服务/类/任何您决定的外部使用此类API。

相关文章