繁体   English   中英

TypeORM createQueryBuilder:可以使用表名作为字符串而不是实体

[英]TypeORM createQueryBuilder: Is possible to use table name as string instead of entity

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

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

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

据我所知,TypeORMs createQueryBuilder需要在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是一个字符串,而不是一个实体(类)类型

如果有更清洁的方法可以实现这一点,我真的不想进行类型转换并开始做令人讨厌的事情。 我没有在官方文档中找到任何解决方案

那里有什么绝妙的主意吗? 谢谢大家

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

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

您可以通过表名从表中获取 select,而无需像这样定义实体:

const res = await manager
  .createQueryBuilder()
  .select()
  .from("tableName", null)
  .where("tableName.id = :id", { id: 1 })
  .getRawMany();

请确保将from()的第二个参数明确设置为 null。

您可以尝试使用原始查询:

import { getManager } from 'typeorm'

const tableName = await getDynamicallyGenetaredTableNames().getFirstOne()

// Use the table name in a raw SQL query
const result = await getManager().query(`SELECT * FROM ${tableName}`)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM