尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

MikroORM 核心包实战指南:@mikro-orm/core 的安装、实体定义与工作单元机制

发布时间:2026/9/29 8:48:34

资讯中心
01
ARTICLE

MikroORM 核心包实战指南:@mikro-orm/core 的安装、实体定义与工作单元机制

MikroORM 核心包实战指南:@mikro-orm/core 的安装、实体定义与工作单元机制
后端【免费下载链接】mikro-ormTypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, MS SQL Server, PostgreSQL and SQLite/libSQL databases.项目地址https://gitcode.com/gh_mirrors/mi/mikro-orm点击查看免费下载mikro-orm/core 是 MikroORM 的基石包承载着 EntityManager、元数据系统、Unit of Work工作单元、Identity Map身份映射与实体生命周期管理等全部核心运行时。本文以仓库中的 packages/core/README.md 为主线结合 核心源码 深入讲解如何安装配置该包、用defineEntity定义实体并完成持久化与查询同时剖析其底层机制帮助你建立从 API 使用到内部原理的完整认知。包概览core 在 MikroORM 生态中的位置mikro-orm/core是一套基于Data Mapper数据映射器、Unit of Work工作单元与 Identity Map身份映射模式构建的 TypeScript ORM支持 MongoDB、MySQL、MariaDB、PostgreSQL、SQLite、libSQL、MSSQL 与 Oracle 等数据库。它是所有其他包各数据库驱动包、migrations、seeder、entity-generator 等的共同依赖驱动包负责与具体数据库通信而 core 负责通用的实体管理与持久化语义。从 packages/core/package.json 可以看到当前仓库中该包的版本为7.2.1要求 Node.js 22.17.0并采用 ESM 模块格式type: module。包内还通过子路径导出exports字段提供了./file-discovery、./migrations、./schema、./dataloader等能力入口供上层包按需引用。安装core 必须与数据库驱动包搭配使用core 本身不直接连接任何数据库必须与对应的驱动包一起安装。README 中给出的完整安装矩阵如下npm install mikro-orm/core mikro-orm/postgresql # PostgreSQL npm install mikro-orm/core mikro-orm/mysql # MySQL npm install mikro-orm/core mikro-orm/mariadb # MariaDB npm install mikro-orm/core mikro-orm/sqlite # SQLite npm install mikro-orm/core mikro-orm/libsql # libSQL / Turso npm install mikro-orm/core mikro-orm/mongodb # MongoDB npm install mikro-orm/core mikro-orm/mssql # MS SQL Server npm install mikro-orm/core mikro-orm/oracledb # Oracle选择哪个驱动包取决于目标数据库在后续MikroORM.init()的配置中还可以通过driver选项显式指定驱动类。各驱动的具体实现位于仓库 packages 目录下的postgresql/、mysql/、mongodb/、sqlite/、mssql/、oracledb/等子包中。快速开始用 defineEntity 定义实体并完成首次读写README 推荐使用defineEntity方式定义实体这是当前版本的主推做法相关专项文档见 docs/docs/define-entity.md。完整示例直接取自 README并可由源码验证其可用性import { defineEntity, p, MikroORM } from mikro-orm/postgresql; const AuthorSchema defineEntity({ name: Author, properties: { id: p.integer().primary(), name: p.string(), email: p.string(), books: () p.oneToMany(Book).mappedBy(author), }, }); export class Author extends AuthorSchema.class {} AuthorSchema.setClass(Author); const BookSchema defineEntity({ name: Book, properties: { id: p.integer().primary(), title: p.string(), author: () p.manyToOne(Author).inversedBy(books), }, }); export class Book extends BookSchema.class {} BookSchema.setClass(Book); // 初始化 ORM const orm await MikroORM.init({ entities: [Author, Book], dbName: my-db, }); // 创建并持久化实体 const author orm.em.create(Author, { name: Jon Snow, email: snowwall.st }); orm.em.create(Book, { title: My Life on The Wall, author }); await orm.em.flush(); // 带关联查询 const authors await orm.em.find( Author, { name: { $like: %Jon% } }, { populate: [books], }, );defineEntity 的底层实现属性构建器与类型推断defineEntity的实现位于 packages/core/src/entity/defineEntity.ts。从源码可以确认几个关键点p是属性构建器的别名defineEntity源码末尾通过defineEntity.properties propertyBuilders; export { propertyBuilders as p }导出因此p.integer()、p.string()、p.oneToMany()等工厂函数都来自同一套propertyBuilders见 defineEntity.ts#L1147-L1248。每个属性构建器携带类型信息UniversalPropertyOptionsBuilder内部维护~options与~type两个标记字段链式调用如.primary()、.mappedBy()会通过assignOptions不断合并选项最终defineEntity把这些构建器的~options提取出来构造出一个EntitySchema实例。类型是推断出来的而不是手写的源码中的InferEntityFromProperties与InferBuilderValue等类型工具会从属性定义中推断实体的完整 TypeScript 类型含Collection、Ref、可空属性、mapToPk、hidden等语义因此orm.em.create(Author, ...)与orm.em.find(Author, ...)都能获得完整的类型安全。延迟求值支持自引用关系当属性值是一个函数如() p.oneToMany(Book)时源码通过Object.defineProperty定义了一个惰性 getter首次访问时才调用构建器这保证Book尚未定义时也能被Author引用详见 defineEntity.ts#L1560-L1590。属性链有编译期防护PropertyChain接口中对关系方法做了HasKind约束例如mappedBy只允许在1:m/1:1/m:n上使用标量属性上误用会在编译期直接报错见 defineEntity.ts#L87-L293。属性构建器常用链式方法速查从UniversalPropertyOptionsBuilder的源码中可以归纳出以下高频方法均可在链式调用中组合类别方法说明主键与约束.primary()/.autoincrement()/.unique()/.index()定义主键、自增、唯一约束与索引SQL 场景下会作用于 Schema Generator空值语义.nullable()/.strictNullable()前者类型为T \| null \| undefined后者仅为T \| null默认值与自动赋值.default(value)/.defaultRaw(now())/.onCreate(cb)/.onUpdate(cb)指定默认值、SQL 函数默认值以及 flush 时的自动赋值钩子数据库列.fieldName()/.columnType()/.length()/.precision()/.scale()/.comment()/.collation()精细控制列名、列类型与列注释SQL only序列化.hidden()/.serializer(fn)/.serializedName()/.groups(...)控制序列化输出配合 docs/docs/serializing.md乐观锁.version()/.concurrencyCheck()开启版本号或并发字段乐观锁见 docs/docs/transactions.md懒加载.lazy()/.ref()/.lazyRef()标量懒加载与引用包装ScalarReference/LazyRef关系.mappedBy()/.inversedBy()/.owner()/.cascade()/.eager()/.orphanRemoval()/.mapToPk()/.pivotTable()/.pivotEntity()定义关系的拥有侧、级联与加载行为见 docs/docs/relationships.md 与 docs/docs/cascading.md其他.check(sql)/.generated(sql)/.formula(sql)/.customOrder(...)/.groups(...)检查约束、生成列、公式列与自定义排序以 README 示例为参照p.integer().primary()等价于传统装饰器写法中的PrimaryKey()p.manyToOne(Author).inversedBy(books)则对应ManyToOne(() Author, { inversedBy: books })。三种实体定义方式defineEntity、装饰器与 EntitySchemaREADME 明确指出实体定义有三种途径均可被 core 的元数据系统识别defineEntity推荐如上所示纯 TypeScript 写法无需reflect-metadata依赖类型推断完全由构建器链驱动最契合现代 TS 工程。装饰器decorators使用Entity()、PrimaryKey()、Property()、ManyToOne()等装饰器标注实体类详细用法见 docs/docs/decorators.md 与 docs/docs/defining-entities.md。EntitySchema以纯对象/类形式手工描述元数据适合无法使用装饰器或defineEntity的场景如普通 JavaScript 项目见 docs/docs/defining-entities.md。无论采用哪种方式最终都会被解析为统一的EntityMetadata供 Discovery、Identity Map 与 Unit of Work 使用——这正是 core 能同时服务 SQL 与 MongoDB 的根基。初始化流程MikroORM.init 内部发生了什么MikroORM.init是每次应用的入口。从 packages/core/src/MikroORM.ts 的源码可以看到其内部顺序合并传入的options并默认开启discovery.skipSyncDiscovery异步发现优先loadOptionalDependencies加载可选依赖new MikroORM(options)构造实例创建Configuration、实例化驱动config.getDriver()、初始化MetadataDiscovery并注册extensions配置中声明的扩展migrations、seeder、entity-generator 等都以扩展形式挂载执行metadata.discover(preferTs)异步发现实体元数据可通过preferTs配置优先读取.ts源文件调用createEntityManager()创建全局EntityManager挂载到orm.em上。初始化完成后orm.em就是贯穿整个应用的入口对象。此外MikroORM类还提供connect()、reconnect()、isConnected()、checkConnection()、close()等连接管理方法见 MikroORM.ts#L177-L215。EntityManagercreate、flush 与 find 的核心语义示例中的orm.em是EntityManager实例其实现在 packages/core/src/EntityManager.tsem.create(Entity, data)将普通对象包装为受管理的实体实例并加入当前上下文源码见 EntityManager.ts#L2448 附近。注意它不会立即写库。em.flush()提交所有待处理的变更。flush 是 Unit of Work 的核心动作——先计算实体的变更集change sets再将变更包裹进一个数据库事务统一执行README 称之为 Automatic Transactions。实现见 packages/core/src/unit-of-work/UnitOfWork.ts 的commit()方法。em.find(Entity, where, options)按条件查询支持操作符查询如$like、populate预加载关联等populate: [books]会一次性加载 Author 的 books 集合避免 N1 查询。相关方法还包括findAll、findAndCount、findOne、findOneOrFail、findByCursor等对应行号见 EntityManager.ts 的find/findOne/findAll定义。em.transactional(cb)在显式事务中执行回调EntityManager.ts#L1987。底层机制Identity Map 与 Unit of WorkREADME 将 Identity Map 与 Unit of Work 列为最核心的两大特性二者的实现均位于 packages/core/src/unit-of-work 目录Identity Map身份映射类定义见 packages/core/src/unit-of-work/IdentityMap.ts。它按实体类与主键维护实体实例缓存保证同一主键在同一上下文中只存在一个对象实例避免并发修改同一行数据造成的不一致。这也是identity map模式的本质应用内读取到的是同一份实体引用。Unit of Work工作单元类定义见 packages/core/src/unit-of-work/UnitOfWork.ts。它跟踪实体的状态managed / new / detached 等在flush()时统一计算 insert/update/delete 变更集并通过commit()执行getById()UnitOfWork.ts#L230则负责从 Identity Map 中按主键取回已加载实体。上述机制的完整行为说明见 docs/docs/identity-map.md 与 docs/docs/unit-of-work.md。正是这两套机制让 Data Mapper 模式下的实体得以自动跟踪变更、事务化批量写入开发者通常无需手动编写INSERT/UPDATE/DELETE语句。核心特性巡礼README 列出的特性在仓库中均有对应文档与实现可作为后续深入路线实体定义三选一docs/docs/define-entity.md、docs/docs/defining-entities.md、docs/docs/decorators.mdIdentity Map 与 Unit of Workdocs/docs/identity-map.md、docs/docs/unit-of-work.md类型安全的 QueryBuilderdocs/docs/query-builder.md自动事务flush 计算变更集并包裹事务配合显式事务与乐观锁参见 docs/docs/transactions.md级联持久化/删除docs/docs/cascading.md全局与作用域查询过滤器docs/docs/filters.mdSchema 生成与迁移docs/docs/schema-generator.md、docs/docs/migrations.md数据填充与实体生成docs/docs/seeding.md、docs/docs/entity-generator.mdEmbeddables、自定义类型与序列化docs/docs/embeddables.md、docs/docs/custom-types.md、docs/docs/serializing.md从源码继续深入mikro-orm/core的公共导出集中在 packages/core/src/index.ts从这里可以看到 core 的全部能力面EntityManager、MikroORM、entity/Collection、Reference、defineEntity、unit-of-work/UnitOfWork、IdentityMap、metadata/EntitySchema、MetadataDiscovery、drivers/、platforms/、types/、naming-strategy/、serialization/、events/与logging/等模块。结合 tests 目录下的EntityManager.test.ts、MikroORM.test.ts、defineEntity.test.ts以及 tests/features 中的 feature 级测试可以进一步验证本文所述 API 的真实行为。官方入口文档可参考 docs/docs/quick-start.md完整的架构说明见 docs/docs/architecture.md。赞分享后端【免费下载链接】mikro-ormTypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, MS SQL Server, PostgreSQL and SQLite/libSQL databases.项目地址https://gitcode.com/gh_mirrors/mi/mikro-orm点击查看免费下载相关推荐MikroORM Oracle 驱动实战指南mikro-orm/oracledb 的安装、配置与源码级原理MikroORM Oracle 驱动实战指南mikro orm/oracledb 的安装、配置与源码级原理 导读 本文围绕 MikroORM 官方 Orac后端MikroORM 的 mikro-orm 元包历史沿革、迁移路径与正确的安装姿势MikroORM 的 mikro orm 元包历史沿革、迁移路径与正确的安装姿势 导读 mikro orm 是 MikroORM 生态中的一个特殊存在——它后端MikroORM v7 装饰器完全指南mikro-orm/decorators 的 ES Spec 与 Legacy 双模式实体映射MikroORM v7 装饰器完全指南mikro orm/decorators 的 ES Spec 与 Legacy 双模式实体映射 MikroORM v7后端上一篇5分钟掌握Moshi音频可视化从波形图到频谱分析的完整指南下一篇FreeCAD二次开发案例机械零件自动生成工具开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。