首页 > 解决方案 > TypeORM createQueryBuilder:可以使用表名作为字符串而不是实体

问题描述

在我当前的场景中,第三方将在我的数据库上动态创建表,并将表名存储为 avarchar和列名,就像jsonb在我的 NestJS 后端中定义为实体的其他表中一样。

这样我就可以跟踪(和查询)这些表,因为我无法控制它的创建。

为此,我想使用TypeORMcreateQueryBuilder不是使用原始查询,因为它更容易让我玩抽象。

据我所知,TypeORMscreateQueryBuilder需要在from子句中定义一个实体。

像这样的东西:

return await getManager()
  .createQueryBuilder()
  .select('*')
  .from(MyDefinedModel, 'modelAlias')
  .getRawMany();
}

所以我想做类似的事情:

const tableName = await getDynamicallyGenetaredTableNames().getFirstOne()
// now tableName points to a string that is a table name, i.e 'table-data-192239'

 return await getManager()
  .createQueryBuilder()
  .select('*')
  .from(tableName, 'tableAlias')
  .getRawMany();

所以传递表名我指向正确的表,但是 TypeORM(和 TS)抱怨因为那tableName是一个字符串,而不是一个实体(类)类型

如果有更清洁的东西可以实现这一点,我真的不想打字并开始做讨厌的事情。我在官方文档中没有找到任何解决方案

有什么绝妙的想法吗?谢谢大家

标签: javascriptsqlnode.jsnestjstypeorm

解决方案


我们可以传递表名而不是实体getRepository

let tableName = 'user';
let query = getRepository(tableName).createQueryBuilder(tableName);

推荐阅读