使用单独的实体定义进行迁移

时间:2020-02-27 13:42:08

标签: nestjs typeorm

我正在尝试使用具有单独实体定义的实体来更新数据库。

未使用选项syncnize = true或以下命令更新数据库:

ts-node ./node_modules/typeorm/cli.js migration:generate -n CreateDatabase

会生成一个空的迁移文件。

我忘记了什么?

重现步骤或显示问题的小资料库:

ormconfig.json

{
  "type": "postgres",
  "host": "localhost",
  "port": 5432,
  "username": "postgres",
  "password": "secret",
  "database": "app",
  "entities": ["src/**/entities/*.entity.ts"],
  "migrations": ["src/database/migrations/*.ts"],
  "cli": {
    "migrationsDir": "src/database/migrations"
  },
  "synchronize": true
}

topic.entity.ts

export class Topic {
  title: string
}
topic.schema.ts

import { EntitySchema, EntitySchemaColumnOptions } from 'typeorm'
import { Topic} from '../topic.entity'

export const TopicSchema = new EntitySchema<Topic>({
  name: 'topics',
  target: Topic,

  columns: {
    title: {
      name: 'title',
      type: 'text',
      nullable: true,
    } as EntitySchemaColumnOptions,
  },
})

2 个答案:

答案 0 :(得分:0)

请尝试将topic.entity.ts分别分为topic.entity.tstopic.schema.ts,并仅在topic.schema.ts上使用ormconfig.json

将实体部分从ormconfig.json更改为:

“实体”:[“ src / ** / entities / *。schema.ts”]

答案 1 :(得分:0)

我为此苦苦挣扎。我所做的是分裂成 模型和架构。模型是一个普通的类。

Session.ts

  export class Session {
     token: string;
     userId: string;
  }

Session.entity.ts

和架构。 如果您忘记了目标,它会将每个实体统一到一个表中。不要忘记那个。并使用与模型相同的名称,以便正确匹配。

import {EntitySchema} from "typeorm";
import { Session } from "../models/Session";

export const SessionEntity = new EntitySchema<Session>({
  name: "Session", // BE CAREFUL: must be the same name as Model, STRING
  target: Session, // This must be the Class itself, NOT STRING
  columns: {
    token: {
      type: String,
      primary: true,
      generated: "uuid"
    },
    userId: {
      type: String
    }
  }
});

并使用它

import { SessionEntity } from "../entities/Session.entity";
const connection = this.typeORMService.get("default");
const repository = this.ormService.connection.getRepository(SessionEntity);
const session = await repository.save({userId: "123"});

您可能遇到的另一个问题是,如果您在代码和 ormconfig.json 中添加设置,它将使用代码设置。所以也要小心。

我更喜欢在这样的代码中设置设置:

const rootDir = __dirname;
@Configuration({
  rootDir,
  typeorm: [
    {
      name: "default",
      synchronize: true,
      type: "postgres",
      url: process.env.DATABASE_URL || config.DATABASE_URL,
      ssl: process.env.DATABASE_URL ? true : false,  // If env var is not set then it is dev
      "entities": [ 
        `${rootDir}/**/*.entity.js`,
        `${rootDir}/**/*.entity.{ts,js}`
      ],
      "migrations": [`${rootDir}/migrations/**/*.js`],
      subscribers: [
        `${rootDir}/subscriber/*.js}`
      ]
    }
  ]
})

我希望你觉得这很有用。如果您有任何疑问,请告诉我。