Typeorm - 基于实体的迁移
Posted
技术标签:
【中文标题】Typeorm - 基于实体的迁移【英文标题】:Typeorm - migrations based on entities 【发布时间】:2021-05-23 20:27:15 【问题描述】:所以我将 typeorm 与 ormconfig.json 一起使用。
由于synchronize
无法在生产环境中使用,我该如何运行基于实体的迁移?
我的ormconfig.json
文件
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "",
"password": "",
"database": "backend-api",
"synchronize": false,
"logging": true,
"migrationsRun": true,
"entities": ["dist/entity/**/*.js"],
"migrations": ["dist/migration/**/*.js"],
"subscribers": ["dist/subscriber/**/*.js"],
"cli":
"entitiesDir": "src/entity",
"migrationsDir": "src/migration",
"subscribersDir": "src/subscriber"
这里也是我唯一的Todo.ts
实体文件
import
BaseEntity,
Column,
CreateDateColumn,
Entity,
PrimaryGeneratedColumn,
UpdateDateColumn,
from 'typeorm';
@Entity()
export class Todo extends BaseEntity
@PrimaryGeneratedColumn()
id: number;
@Column('text')
text: string;
@Column('boolean', default: false )
completed: boolean;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
【问题讨论】:
【参考方案1】:要基于entities 运行迁移,您可以从您的entities 生成migrations 文件,如TypeOrm documentation about generating migrations 中所述。
TypeORM 能够使用您所做的架构更改自动生成 迁移 文件。
运行此命令指定迁移的名称以生成文件:
typeorm migration:generate -n <MigrationName>
之后,您只需使用 CLI 运行您的迁移:
typeorm migration:run
一个好的做法是在您的数据库配置中使用migrationsRun
参数以在启动时运行您的迁移:
migrationsRun: true,
【讨论】:
在生成它时要求我创建一个迁移。但它不会从实体中获取 您是否在数据库配置中指定了实体和迁移的路径? 你的数据库是空的,没有任何表吗? TypeOrm 正在匹配您的实体和数据库之间的差异以生成缺少的表/列 我已经删除了数据库并创建了另一个,但还是一样 不要手动删除表,而是尝试运行typeorm schema:drop
【参考方案2】:
找到了解决这个问题的办法。
所以我的ormconfig.json
需要稍微更新一下,
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "",
"password": "",
"database": "backend-api",
"synchronize": false,
"logging": true,
"migrationsRun": false,
"entities": ["src/entity/**/*.ts"],
"migrations": ["src/migration/**/*.ts"],
"subscribers": ["src/subscriber/**/*.ts"],
"cli":
"entitiesDir": "src/entity",
"migrationsDir": "src/migration",
"subscribersDir": "src/subscriber"
我需要安装ts-node
来编译ts
实体和迁移文件。
我创建了以下提到的脚本:
"scripts":
"start": "ts-node src/index.ts",
"entity:create": "./node_modules/.bin/ts-node ./node_modules/.bin/typeorm entity:create -n",
"migrate:generate": "./node_modules/.bin/ts-node ./node_modules/.bin/typeorm migration:generate -n",
"migrate:run": "./node_modules/.bin/ts-node ./node_modules/.bin/typeorm migration:run",
"migrate:revert": "./node_modules/.bin/ts-node ./node_modules/.bin/typeorm migration:revert",
"schema:drop": "./node_modules/.bin/ts-node ./node_modules/.bin/typeorm schema:drop"
并按照脚本的顺序。
我学到的一件事是你不能简单地创建一个实体文件并在其上运行migration:generate
。您首先需要创建一个基于typeorm
cli 的实体。我不知道为什么,但对我来说,一旦我开始使用 cli 创建实体,一切就到位了
【讨论】:
以上是关于Typeorm - 基于实体的迁移的主要内容,如果未能解决你的问题,请参考以下文章
TypeORM 不会在由 TypeORM 创建的项目中生成迁移
typeORM 未发现数据库架构更改 - 无法生成迁移。要创建新的空迁移,请使用“typeorm migration:create”命令