使用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
相关产品推荐
相关产品推荐

