You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TypeORM(Node.js)执行迁移时遇目录及生成失败问题

TypeORM迁移生成失败问题排查与解决

问题现象

执行npm run migrate:generate时收到报错:

No changes in database schema were found - cannot generate a migration. To create a new empty migration use "typeorm migration:create" command

环境信息

目录结构

src/
├── database/
│   └── config.ts
├── entities/
│   └── User.ts
├── app.ts
└── server.ts

数据源配置(config.ts)

import { DataSource } from "typeorm"
import dotenv from 'dotenv';

dotenv.config();

export const AppDataSource = new DataSource({
    type: "postgres",
    host: process.env.DATABASE_HOST,
    port: 5432,
    username: process.env.DATABASE_USERNAME,
    password: process.env.DATABASE_PASSWORD,
    database: process.env.DATABASE_NAME,
    synchronize: true,
    logging: true,
    entities: [`${__dirname}/**/entities/*.{ts,js}`],
    migrations: [`${__dirname}/**/database/migrations/*.{ts,js}`],
})

package.json脚本配置

{
  "name": "authapi",
  "version": "1.0.0",
  "scripts": {
    "dev": "nodemon --exec ts-node ./src/server.ts",
    "migration:generate": "typeorm-ts-node-commonjs -d ./src/database/config.ts migration:generate ./src/database/migrations/default",
    "migration:run": "typeorm-ts-node-commonjs -d ./src/database/config.ts migration:run"
  },
  // 其余依赖省略
}

User实体代码

import { BeforeInsert, BeforeUpdate, Column, Entity, PrimaryGeneratedColumn } from "typeorm";
import bcrypt from 'bcryptjs';

@Entity('users')
export class User {
    @PrimaryGeneratedColumn('uuid')
    id: string;

    @Column({
        default: false,
    })
    isActivate: boolean;

    @Column()
    username: string;

    @Column()
    email: string;

    @Column()
    password: string;

    @Column({
        default: ''
    })
    tokenActivate: string;

    @Column({
        default: ''
    })
    tokenResetPass: string;

    @BeforeInsert()
    @BeforeUpdate()
    hashPassword() {
        this.password = bcrypt.hashSync(this.password, 8);
    }
}

解决步骤

1. 关闭自动同步schema配置

synchronize: true会自动将实体结构同步到数据库,导致TypeORM无法检测到需要生成迁移的变化。修改config.ts:

export const AppDataSource = new DataSource({
    // ... 其余配置
    synchronize: false, // 改为false
    // ...
})

2. 修正实体与迁移文件路径

当前配置的路径无法正确定位到实体文件:

  • entities路径:${__dirname}指向src/database,需向上一级定位到entities目录,改为${__dirname}/../entities/*.{ts,js}
  • migrations路径:直接指向database下的migrations目录,改为${__dirname}/migrations/*.{ts,js}

修改后的config.ts路径部分:

export const AppDataSource = new DataSource({
    // ... 其余配置
    entities: [`${__dirname}/../entities/*.{ts,js}`],
    migrations: [`${__dirname}/migrations/*.{ts,js}`],
})

3. 确保migrations目录存在(自动创建)

如果src/database/migrations目录不存在,TypeORM不会自动创建。可修改package.json脚本,在生成迁移前先创建目录:

  • Linux/macOS:
{
  "scripts": {
    "migration:generate": "mkdir -p ./src/database/migrations && typeorm-ts-node-commonjs -d ./src/database/config.ts migration:generate ./src/database/migrations/default"
  }
}
  • Windows:
{
  "scripts": {
    "migration:generate": "if not exist ./src/database/migrations mkdir ./src/database/migrations && typeorm-ts-node-commonjs -d ./src/database/config.ts migration:generate ./src/database/migrations/default"
  }
}

4. 确保数据源完成初始化

在server.ts中添加数据源初始化逻辑,确保TypeORM能正确连接数据库:

import { AppDataSource } from './database/config';

async function startServer() {
  // 初始化数据源
  try {
    await AppDataSource.initialize();
    console.log('数据库连接成功');
  } catch (err) {
    console.error('数据库连接失败:', err);
    process.exit(1);
  }

  // 启动Express服务等逻辑
  // ...
}

startServer();

5. 重置数据库表(可选)

如果之前通过synchronize: true已经将User实体同步到数据库,需先删除数据库中的users表,再执行迁移生成命令,TypeORM就能检测到创建表的变化。

验证执行

完成上述修改后,执行:

npm run migrate:generate

此时会自动在src/database/migrations目录下生成包含创建users表逻辑的迁移文件,之后执行npm run migration:run即可应用迁移。

内容的提问来源于stack exchange,提问作者Routfin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:57:19