每次我运行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
命令应该只生成具有最近更改的迁移。
答案 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()