TypeORM:尝试手动运行迁移时“没有待处理的迁移”

Posted

技术标签:

【中文标题】TypeORM:尝试手动运行迁移时“没有待处理的迁移”【英文标题】:TypeORM: "No migrations pending" when attempting to run migrations manually 【发布时间】:2020-10-30 11:15:21 【问题描述】:

我有一个新的网络应用程序,并且我已经编写了一个迁移器来创建一个用户表。但是,无论我尝试什么,typeorm 似乎都找不到这个迁移器,因此也没有运行它。

我的文件结构(其他文件/文件夹未显示):

├── Server
│   ├── dist
|   |   ├── Migrations
|   |   |   ├── 1234567891234567890-AddUserTable.js
|   |   |   ├── 1234567891234567890-AddUserTable.js.map
|   |   |   ├── 1234567891234567890-AddUserTable.d.ts
│   ├── src
|   |   ├── Migrations
|   |   |   ├── 1234567891234567890-AddUserTable.ts
|   |   ├── app.module.ts

app.module.ts

@Module(
    imports: [
        ConfigModule.forRoot( envFilePath: '.env' ),
        TypeOrmModule.forRootAsync(
            imports: [ConfigModule],
            useFactory: (configService: ConfigService) => (
                type: 'mysql',
                host: configService.get('TYPEORM_HOST'),
                port: +configService.get<number>('TYPEORM_PORT'),
                username: configService.get('TYPEORM_USERNAME'),
                password: configService.get('TYPEORM_PASSWORD'),
                database: configService.get('TYPEORM_DATABASE'),
                synchronize: configService.get('TYPEORM_SYNCHRONIZE'),
                entities: [__dirname + '/**/*.entity.ts,.js'],
                migrations: [__dirname + '/Migrations/**/*.js'],
                migrationsRun: false,
                cli: 
                    migrationsDir: './Migrations',
                ,
            ),
            inject: [ConfigService],
        ),
    ],
    controllers: [],
    providers: [],
)
export class AppModule 
    constructor(private connection: Connection) 

为了运行它,在我的控制台窗口中,我输入:nest start 以启动我的服务器。

然后,我运行npx typeorm migration:run,得到:

query: SELECT * FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = 'myDB' AND `TABLE_NAME` = 'migrations'
query: SELECT * FROM `myDB`.`migrations` `migrations` ORDER BY `id` DESC
No migrations are pending

如果我查看我的数据库,我会看到一个 migrations 表,其中没有任何条目。

我已尝试删除我的迁移器文件并使用更新的时间戳重新创建它,但这也不起作用。

npx typeorm migration:create -n "MyMigratorName"

任何帮助将不胜感激。

【问题讨论】:

尝试将cli: migrationsDir: './Migrations' 更改为cli: migrationsDir: __dirname + './Migrations' 那行不通。 我也有同样的问题 【参考方案1】:

对于任何来这里寻求帮助的人:

上面的配置提到要在 js 文件中找到迁移:

migrations: [__dirname + '/Migrations/**/*.js'],

但是从文件夹结构来看,迁移是写在 ts 文件而不是 js 中的。

要从 ts 运行迁移,请遵循此处描述的官方推荐方式:

https://github.com/typeorm/typeorm/blob/master/docs/using-cli.md#if-entities-files-are-in-typescript

同样在这种情况下不要忘记将迁移 blob 更新为 ts:

migrations: [__dirname + '/Migrations/**/*.ts'],

如果您想从 js 文件运行迁移,则必须在 ts 文件编译为 js 形式后提供来自 dist 文件夹的位置。

【讨论】:

__dirname 应该是什么意思?每当我实施它时,它都会给我错误,它以红色显示,还是我应该在 dirname 的位置放置一些不同的东西?我很困惑,typeORM 迁移有很多问题);【参考方案2】:

Typeorm 只加载带有 js 扩展名的文件的迁移,

在您设置连接的 ormconfig 文件中;


    "type": "mysql",
    "host": "localhost",
    "port": 3306,
    "username": "test",
    "password": "test",
    "database": "test",
    "entities": ["entity/*.js"],
    "migrationsTableName": "custom_migration_table",
    "migrations": ["migration/*.js"],
    "cli": 
        "migrationsDir": "migration"
    

"migrations": ["migration/*.js"] - 表示 typeorm 将从给定的“迁移”目录加载迁移。

如果您的迁移文件夹存储在 dist 或 src 目录中,

"migrations": ["migration/*.js"] 现在将是 "migrations": ["dist/migration/*.js"]"migrations": ["src/migration/*.js"],* 表示任何迁移文件名。 只需确保放置在这里的任何目录/目录["migration/*.js"] 都会导致您的迁移文件所在的位置

"migrationsDir": "migration"- 表示 CLI 必须在“migration”目录中创建新的迁移。因此,您在此处指定的任何目录都是创建迁移文件的位置。

请注意,如果您的迁移文件具有 typescript 扩展名 (.ts),则您必须将迁移文件编译为 javascript 文件,否则 typeorm 将无法找到它们。

【讨论】:

【参考方案3】:

除了@Upka Uchechi 给出的答案

如果您使用的是打字稿,则需要运行以下命令

$ npm run build   # This will compile the typescript files into JavaScript files 
$ npm run typeorm -- migration:run

提供更多上下文。 如果您的配置文件位于&lt;PROJECT ROOT&gt;/db-migrations,则上面的构建命令应该将已编译的 JavaScript 文件移动到 &lt;PROJECT ROOT&gt;/dist/db-migrations。为此,您的配置文件将如下所示

  ... 
  "migrations": ["dist/db-migrations/*.js"],
  ...

【讨论】:

以上是关于TypeORM:尝试手动运行迁移时“没有待处理的迁移”的主要内容,如果未能解决你的问题,请参考以下文章

使用 TypeORM 和 NestJs 和 Typescript 创建新迁移时出错 [关闭]

使用 NestJS 和 TypeORM 为项目生成迁移文件

运行nestjs应用程序时typeorm迁移中的“不能在模块外使用import语句”

播种时NestJS中的TypeOrm:RepositoryNotFoundError

TypeORM 生成空迁移

TypeORM - 如何在生产模式下创建新表并自动运行迁移?