跟随Ben Awad的lireddit教程运行Mikro-ORM首次迁移报错如何解决
你的所有问题核心根源大多来自MikroORM配置错误以及误用了MongoDB专属的主键规则在PostgreSQL上,按以下步骤逐一修复即可:
1. 修正MikroORM驱动与基础配置
首先打开你的mikro-orm.config.ts,确认以下配置项正确:
- 驱动必须指定为PostgreSQL驱动,不要用MongoDB驱动:
import { PostgreSqlDriver } from '@mikro-orm/postgresql'; import path from 'path'; import { Options } from '@mikro-orm/core'; export default { driver: PostgreSqlDriver, // 实体路径配置,确保只扫你自己的实体文件夹,不要包含node_modules entities: [path.join(__dirname, './entities/**/*.js')], entitiesTs: [path.join(__dirname, './entities/**/*.ts')], // 迁移路径配置,仅指向自己的迁移文件夹 migrations: { path: path.join(__dirname, './migrations'), pathTs: path.join(__dirname, './src/migrations'), pattern: /^[\w-]+\d+\.[tj]s$/, }, dbName: '你的数据库名', // 其他数据库账号、密码配置 } as Options<PostgreSqlDriver>;
如果你之前配置的是MongoDB驱动,它会默认把主键映射为_id字段,就会触发你最开始的非空约束报错。
2. 修正Post实体的主键配置
PostgreSQL不需要下划线前缀的主键,也不需要ObjectId、SerializedPrimaryKey这类MongoDB专属配置,直接用自增主键即可:
import { Entity, PrimaryKey, Property } from "@mikro-orm/core"; @Entity() export class Post { // 显式指定自增,数据库会自动生成id值,无需手动传入 @PrimaryKey({ type: 'number', autoincrement: true }) id!: number; @Property({ type: "date" }) createdAt: Date = new Date(); @Property({ type: "date", onUpdate: () => new Date() }) updatedAt: Date = new Date(); @Property({ type: "text" }) title!: string; }
3. 清理旧资源重新生成迁移
依次执行以下操作:
- 打开你的PostgreSQL客户端,删除之前创建的
post表以及mikro_orm_migrations表 - 删除本地的
src/migrations文件夹、dist文件夹、node_modules文件夹 - 重新执行
yarn install安装依赖 - 运行命令生成初始迁移:
npx mikro-orm migration:create --initial
此时就不会再报「已有迁移存在」的错误,因为我们已经配置了迁移路径仅指向自己的文件夹,不会扫到node_modules里的文件。
4. 修正运行代码
不需要手动调用updateSchema,直接用迁移即可,你的运行代码本身没有问题,修复配置后直接运行yarn dev即可正常插入数据。
5. 新建实体报错的修复
你新建Posted实体后报schema相关的错误,是因为实体路径配置没有覆盖到该文件,确认你的entities和entitiesTs配置匹配你实体所在的文件夹即可解决。
内容的提问来源于stack exchange,提问作者Mel
相关产品推荐
相关产品推荐

