如何从TypeORM动态获取列名?

Jam*_* L. 7 javascript typeorm

我努力了

let modelClass = (await import('@models/' + modelName + '.ts'))[modelName];
let keys = Object.keys(modelClass);//no column names included, only custom helper vars i.e. NoteColumnVarcharLength
let keys = Object.keys(new modelClass());//nothing at all in this model
Run Code Online (Sandbox Code Playgroud)

库中有一个辅助函数可以自动获取它们吗?

小智 5

正如该库存储库问题中所建议的(链接)可以通过使用来解决

connection.getMetadata("User").columns
Run Code Online (Sandbox Code Playgroud)

  • 还有 `getConnection().getMetadata(Organization).ownColumns.map(column => column.propertyName)` (3认同)

Pav*_*kov 5

接受的答案看起来不完整,当我尝试应用答案时,我的脑海中出现了许多问题。所以我自己写一下来很好地解决这个问题。

我们必须首先检索EntityMetadata以获取列名称。我们可以从Connection检索EntityMetadata,我们可以通过任何舒适的方式获取它。

import { getConnection, getManager } from 'typeorm';

const connection1 = getConnection();
const connection2 = getManager().connection;
Run Code Online (Sandbox Code Playgroud)

接下来,我们需要检索实体元数据。

我们可以通过

const metadata = connection.getMetadata(modelClass);
Run Code Online (Sandbox Code Playgroud)

在实体元数据中,您可以使用多个选项来查找列。如果需要查找所有列,则需要使用columns. 如果您只想查看用户定义的列,则可以使用ownColumns.

这些属性包含带有ColumnMetadata.

如果您只需要用户定义列的列表,则可以只返回 的映射值propertyName

const columns = metadata.columns.map((column) => column.propertyName);
Run Code Online (Sandbox Code Playgroud)

就我而言,我需要通过属性名称查找数据库列名称。

find()在我的案例中使用了一种方法。

const column = metadata.ownColumns.find((column) => column.propertyName === propertyName);
Run Code Online (Sandbox Code Playgroud)

如果我需要找到几列,我会在propertyName和之间创建一个映射databaseName

const columnMap = Object.fromEntries(
  metadata.ownColumns((column) => ([column.propertyName, column.databaseName]))
);
Run Code Online (Sandbox Code Playgroud)