Typeorm 的迁移:生成重新生成整个数据库模式

Nic*_*rry 17 typeorm

每次我运行时migration:generate,它都会创建一个重新生成整个数据库架构的迁移(而不是仅针对最近对我的实体所做更改的迁移)。我正在使用最新版本的 Typeorm 0.2.7 版。

我的ormconfig.json是:

{
  "host": "localhost",
  "logging": false,
  "port": 5432,
  "synchronize": false,
  "type": "postgres",

  "entities": ["build/server/entity/*.js"],
  "migrations": ["build/server/migration/*.js"],

  "cli": {
    "entitiesDir": "build/server/entity",
    "migrationsDir": "build/server/migration"
  },

  "username": "***",
  "password": "***",
  "database": "***"
}
Run Code Online (Sandbox Code Playgroud)

当我运行时typeorm migration:generate -n SomeEntityChanges,新的迁移文件包含为我的所有实体创建和链接表的说明,即使它们中的大多数已经在build/server/migration.

当我运行时typeorm migration:run,我可以看到没有挂起的迁移,并且已经运行了覆盖现有实体的迁移(即它们在我的migrations表中)。

我错过了什么?该文档说,migration:generate命令应该只生成与最近变化的迁移。

Jua*_*ian 9

这听起来可能真的很愚蠢,但我遇到了同样的问题,问题出在我的数据库的名称上。我的数据库名称是mydbLocal大写的 L,但是当 typeorm 读取以生成新的迁移时,它会查找,mydblocal并且由于没有具有该名称的模式,因此导致生成重新生成整个模式。这似乎是一个错误,因为在解析模式时它会查找小写模式,但在运行迁移时它会进入真实模式(大写 L)。

无论如何,我解决这个问题的方法是将我的数据库名称更改为全部小写,并将我的 ormconfig 数据库名称编辑为全部小写。

这是一个非常奇怪的情况,但这解决了我的问题。希望它也能对其他人有所帮助。


小智 5

正如前面提到的答案之一,对我来说问题确实是数据库名称的驼峰式大小写。将数据库名称更改为全部小写似乎已经解决了迁移生成问题。

但是,在我的新项目中,我注意到实体表名称覆盖似乎也具有相同的行为。奇怪的是,这对我之前的项目来说并不是一个问题。

//Previous table name causing migration file to regenerate    
@Entity({
  name: 'TempTable',
})

//New table name which stops the regeneration   
@Entity({
  name: 'temp_table',
})
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助面临同样问题的人。


zen*_*eni 0

这是因为您的数据库可能是空的。TypeOrm 计算实际代码库实体和实际数据库之间的差异,从而生成迁移。

检查您的 ormconfig.json,因为它是由 typeorm CLI 读取来生成迁移的内容,它可能指向一个空数据库,从而生成迁移中的所有表。

只需迁移数据库,然后再次运行生成即可。

  • 我在干净的数据库上遇到了同样的问题,它第一次生成正确的迁移,用实体填充数据库,然后第二次生成相同的迁移。数据库肯定不为空。 (2认同)