Typeorm的迁移:generate重新生成整个数据库架构

时间:2018-10-14 06:48:39

标签: 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": "***"
}

当我运行typeorm migration:generate -n SomeEntityChanges时,新迁移文件包含有关为我的实体 all 创建和链接表的说明,即使其中大多数实体已经在{{1}中进行了相应的迁移}。

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

我想念什么? docs说,migrations命令应该只生成具有最近更改的迁移。

9 个答案:

答案 0 :(得分:2)

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

无论如何,解决问题的方法是将数据库名称更改为小写,然后将ormconfig数据库名称编辑为小写。

这真的很奇怪,但这解决了我的问题。希望它也能帮助其他人。

答案 1 :(得分:2)

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

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

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

//New table name which stops the regeneration   
@Entity({
      name: 'temp_table',
    })

希望这对面临同样问题的人有所帮助。

答案 2 :(得分:1)

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

检查您的ormconfig.json,这是typeorm CLI读取的内容,用于生成迁移,它可能指向空数据库,从而在迁移中生成所有表。

只需在您的数据库上迁移,然后再次运行generate。

答案 3 :(得分:0)

首先,更改:

"entitiesDir": "build/server/entity",
"migrationsDir": "build/server/migration"

通过:

"entitiesDir": "src/server/entity",
"migrationsDir": "src/server/migration"

然后,请记住,在生成新迁移之前,您需要将当前更改应用于数据库,例如,该过程为:

1.-创建第一个实体User.ts
 2.- Transpile:tsc
 3.- typeorm迁移:生成-n SomeEntityChanges
 4.- Transpile:tsc
 5.- typeorm迁移:运行
 6.-向实体User.ts添加一列
 7.-可转换:tsc
 8.- typeorm迁移:生成-n SomeNewEntityChanges
 9.- Transpile:tsc
10.- typeorm迁移:运行

也许您可以简化过程,但是通过这种方式,您可以正确获得新的迁移。

答案 4 :(得分:0)

我一直在MySQL上遇到这个问题,经过数小时的修补,我终于解决了这个问题。

假设{ schema: "public" }修复对您不起作用,以下是我为清除可怕的迁移产生而必须采取的措施。

首先,请确保您正在运行最新版本的TypeORM。我受了一些次要版本的困扰,仅此一项就足以给我无数基于索引的错误。

如果您是最新的,那就太好了!这是个坏消息:您的实体有误。我遇到的最大问题是重复项中的上的default属性。据我了解,当TypeORM尝试将数据库默认值与定义的默认值进行比较时,Postgres和MySQL均返回与预期不同的结果。

例如:在带有四位数尾随小数的“十进制”类型上,default: 0在构建列时工作良好,但是MySQL实际上返回"0.0000",这意味着无论您运行多少次在此更新中,默认值永远不会是文字零。 TypeORM认为这是不同的,并希望将现有的MySQL默认值改回正常的零。

此错误涵盖了从default: null到“ tinyint”布尔值的所有内容,在我的架构中被列为int。

仔细阅读生成的输出,并检查每个实体的所提及的属性。通过更新到最新版本的TypeORM可以解决部分问题,但是我通过确保默认数据实际上与MySQL存储的内容完全匹配,设法彻底清除了将近250个表更改。

答案 5 :(得分:0)

我遇到了同样的问题,我的解决方案不是很不错,但实际上是可行的。

在整个数据库的迁移中,搜索涉及的表,对其进行过滤,然后删除由typeorm生成的所有其他查询,删除后,运行migration命令,它将起作用,可以创建/更改所需的表。

它不具有可伸缩性,但是请记住,here他们指定在迁移之前仅更改几个表。 The rule of thumb is to generate a migration after each entity change.

答案 6 :(得分:0)

您应该使用migration:create而不是migration:generate。我建议在您的package.json内:

{
  ...
  scripts: {
    "migration:create": "NODE_ENV=local npm run typeorm -- migration:create -n",
    "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/.bin/typeorm"
  }
}

然后您可以运行:

$ npm run migration:create NameOfYourMigration

成功创建迁移。

答案 7 :(得分:0)

第一个 注意小写或大写

第二 如果您使用大写名称,请将其放在“”

第三 如果您使用架构,请将其添加到 ormconfig 喜欢:

# here I import and define a bunch of things, e.g
from module1 import dependency1

from file2 import func2
func2()

祝你好运

答案 8 :(得分:-1)

从我的所有{schema: 'public'}定义中删除@Entity都使用Postgresql对我进行了修复

上一个: @Entity({schema: 'public'})

工作: @Entity()