ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MikroORM v2 升级到 v3 完整迁移指南:破坏性变更、新事务模型与实体定义重构

MikroORM v2 升级到 v3 完整迁移指南:破坏性变更、新事务模型与实体定义重构 后端【免费下载链接】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 官方 v2 → v3 升级文档upgrading-v2-to-v3.md为骨架逐一解析每个破坏性变更的成因、影响面与迁移做法并结合当前仓库源码packages/core印证新版本的实际实现。读完本文你将掌握autoFlush默认值变化后的正确持久化方式、基于em.transactional()的新事务模型、去IEntity化的实体类型体系AnyEntity/WrappedEntity、m:n 复合主键与fixedOrder排序、以及日志与元数据提供者的新配置方法。提示v3 属于历史版本本文源码佐证均取自当前仓库v7.x 分支中的实现用于说明这些机制自 v3 引入后如何演进并被保留实际升级到新版本时请以当前版本的 upgrading-v6-to-v7.md 等文档为准。一、autoFlush 默认值改为 false显式 flush 成为默认v2 中autoFlush默认开启实体persist后会自动同步到数据库v3 起默认值变为false。这意味着你必须显式调用em.flush()才能把更改持久化orm.em.persist(new Entity()); // 默认不再自动 flush await orm.em.flush(); // 显式刷新将变更写入数据库 await orm.em.persist(new Entity(), true); // 仍可通过第二个参数强制 auto-flush迁移要点如果你之前显式配置过autoFlush: false现在可以直接删除该配置行行为与默认一致若想平滑过渡仍可在 ORM 配置中临时开启autoFlush但官方不推荐长期使用——它会在每次persist周围产生不必要的小事务损害批量写入性能。从当前仓库源码看这一设计延续至今EntityManager的persist仅在autoFlush开启或调用flush()时才会真正落库而工作单元Unit of Work机制会把多次persist合并到同一次flush()中批量执行相关实现见 packages/core/src/EntityManager.ts 与 packages/core/src/unit-of-work/UnitOfWork.ts。二、实体定义重构告别 IEntity拥抱 AnyEntity / WrappedEntityv2 要求实体与IEntity接口合并导致实体的公开接口被内部方法“污染”。v3 引入了一组纯标记型新接口它们不添加任何属性或方法因此可以完全省略接口适用场景要求IdEntityT数字/字符串主键且属性名为idid: number等UuidEntityT字符串主键且属性名为uuiduuid: stringMongoEntityTMongoDB 实体必须含id: string与_id: ObjectIdAnyEntityT, PK其他任意主键名用PK参数指明主键属性名如AnyEntityBook, myPrimaryPropertyIEntity被重命名为AnyEntity且不再暴露toJSON()、toObject()、init()等公开方法。这些能力改由wrap()提供并在需要时按属性类型增强await wrap(book.author).init(); // 通过 wrap() 使用 init()若希望实体上直接保留全部方法与 v2 一致的体验可通过接口合并引入WrappedEntityT, PK——它同时继承了AnyEntity并声明了所有辅助方法Entity() export class Book { /* ... */ } export interface Book extends WrappedEntityBook, id { }在 packages/core/src/typings.ts 中可以查看IWrappedEntity的完整方法面isInitialized()、populated()、populate()、init()、toObject()、toJSON()、serialize()、assign()、getSchema()/setSchema()等均为实体状态管理的核心 API。更多实体定义示例见 defining-entities.md。三、QueryBuilder 底层接入 Knex连接池与事务模型重建v3 起QueryBuilder内部使用knex执行所有查询连接池能力随之免费获得。此改动带来的关键连锁变化1. 事务 API 收敛为em.transactional()旧的beginTransaction/commit/rollback辅助方法被移除事务必须通过em.transactional()包裹await orm.em.transactional(async (em) { const author new Author(Jon); em.persist(author); // 回调结束时自动 flush });2. 事务上下文从 Driver 上移到 EntityManager所有事务管理逻辑从IDatabaseDriver接口中移除改由 EM 统一持有事务上下文由Connection创建并透传给各 driver 方法。EM 为此新增了两个方法isInTransaction()判断当前 EM 是否运行在数据库事务内getTransactionContext()获取驱动相关的事务上下文对象用于确保查询在同一连接上执行。当前源码实现可见 packages/core/src/EntityManager.tsisInTransaction()检查内部#transactionContextgetTransactionContext()则原样返回该上下文。transactional()方法EntityManager.ts委托TransactionManager处理嵌套、传播与回滚见 packages/core/src/utils/TransactionManager.ts。新版还支持嵌套事务默认创建 savepoint与propagation选项控制传播行为。3. 参数占位符统一为?此前 Postgres 驱动要求按索引的美元符号占位符$1、$2…knex 接管后统一为简单问号?与其他方言保持一致。四、ManyToMany 改用复合主键fixedOrder 保留稳定排序v2 中 m:n 关联表必须有自增主键v3 起默认只要求两列外键并以两者构成的复合主键作为表主键ManyToMany({ entity: () BookTag, pivotTable: book_tags }) tags new CollectionBookTag(this);若你依赖集合的稳定顺序可通过fixedOrder: true恢复旧行为——此时按id列排序排序列名可用fixedOrderColumn覆盖ManyToMany({ entity: () BookTag, fixedOrder: true, fixedOrderColumn: order }) tags new CollectionBookTag(this);也可直接用orderBy: { ... }指定默认排序。从 packages/core/src/metadata/MetadataDiscovery.ts 可以看到这些选项的归一化逻辑fixedOrder在未显式设置时会由fixedOrderColumn推导默认fixedOrderColumn取第一个主键列名属性级配置定义见 packages/core/src/typings.ts。五、实体引用不再持有实例化的集合v2 中所有实体实例包括只知主键的实体引用都带有实例化的集合类v3 起只有已初始化的实体才拥有集合const book em.getReference(Book, 1); console.log(book.tags); // undefined —— 引用阶段不实例化集合 await book.init(); // 初始化后 console.log(book.tags); // Collection 实例尚未加载好处是大幅降低轻量引用如getReference返回的对象的内存占用与初始化开销只有真正访问关系时才会创建Collection。六、EntityAssigner.assign()新实体必须显式传入 EMv2 中所有实体内部都持有根 EM 引用v3 起只有被管理实体已 merge 到 EM如从数据库加载的实体才保留该内部引用。因此对新建未管理实体调用assign()时必须显式提供em参数const book new Book(); wrap(book).assign(data, { em: orm.em });相关实现见 packages/core/src/entity/EntityAssigner.ts 与 packages/core/src/entity/wrap.tsIWrappedEntity.assign()的类型签名位于 packages/core/src/typings.ts。七、严格化的 FilterQuery 与智能查询条件FilterQuery不再允许使用 v2 的“智能操作符”字符串语法。旧写法{ age:gte: 18 }必须改为对象语法或显式把条件断言为any// 旧{ age:gte: 18 } ❌ // 新 em.find(User, { age: { $gte: 18 } });类型层面更严格有助于在编译期捕获拼写错误的字段名与操作符条件对象的类型定义FilterQuery、FilterValue、FilterObjectProp等位于 packages/core/src/typings.ts。八、日志配置内置 console.log 与 debug 命名空间v2 要求自定义 logger 才能开启日志v3 起 logger 默认为console.log()只需通过debug选项订阅感兴趣的命名空间// MikroORM.init 配置 { debug: true, // 开启全部命名空间 // debug: [query, query-params], // 仅订阅部分命名空间 }true/false分别启用 / 禁用所有命名空间可用命名空间query、query-params、discovery、info。当前仓库 packages/core/src/utils/Configuration.ts 仍保留这四个命名空间的定义说明该日志体系自 v3 起延续至今。九、其他破坏性变更速查1. 1:m / m:1 装饰器中的fk选项被移除必须改用mappedBy1:m 侧与inversedBym:1 侧。2.SchemaGenerator.generate()改为异步不再直接调用推荐改用内置 CLI 工具CLI 配置见 installation sectionSchemaGenerator 用法见 schema-generator.md。3. NamingStrategy 接口新增getClassName()该方法根据文件名推断实体类名自定义命名策略时可覆写。若你实现了自定义策略必须补上该方法或改为继承AbstractNamingStrategy。4.TypescriptMetadataProvider更名为TsMorphMetadataProvider同时新增基于reflect-metadata的ReflectMetadataProvider。由于旧名曾是默认提供者多数用户无需改动。当前仓库中内置提供者为ReflectMetadataProvider默认与TsMorphMetadataProvider见 packages/core/src/utils/Configuration.ts。5. MongoDB 驱动最低版本提升到 3.3.4使用 MongoDB 需升级驱动版本。6.EntityManager.find()的where参数变为必填find方法签名与EntityRepository对齐where不再可省略查询全部实体请显式传空对象const all await em.find(Book, {}); // 显式空条件十、升级自查清单按本文顺序逐项检查你的代码库移除冗余的autoFlush: false配置检查所有依赖隐式自动 flush 的代码路径改为显式await em.flush()将实体与IEntity的合并替换为可选的AnyEntityT, PK/IdEntityT/UuidEntityT/MongoEntityT需要完整方法时改用WrappedEntityT, PK把beginTransaction/commit/rollback调用重写为em.transactional(cb)检查 Postgres 参数占位符是否仍为$1格式确认 m:n 关联表迁移方案兼容复合主键依赖稳定顺序时配置fixedOrder: true检查对getReference()返回对象的集合访问必要时先await ref.init()对所有新建实体的wrap(entity).assign(data)补充{ em }参数将{ age:gte: 18 }类智能操作符改为对象语法{ age: { $gte: 18 } }用debug选项替换自定义 logger 的日志初始化清理 1:m/m:1 装饰器中的fk改用mappedBy/inversedBySchemaGenerator 改为 CLI 调用自定义 NamingStrategy 补充getClassName()如有em.find(Entity)无参调用补{}作为where赞分享后端【免费下载链接】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 v2 升级到 v3核心破坏性变更与迁移实战指南MikroORM v2 升级到 v3核心破坏性变更与迁移实战指南 本文基于 MikroORM 官方升级文档 docs/versioned_docs/vers后端MikroORM v2 到 v3 升级完全指南破坏性变更解析与迁移实战MikroORM v2 到 v3 升级完全指南破坏性变更解析与迁移实战 本文以 MikroORM 官方 v2 → v3 升级文档为骨架逐条拆解该版本发布时引后端MikroORM v2 到 v3 升级指南破坏性变更全解析与迁移实战MikroORM v2 到 v3 升级指南破坏性变更全解析与迁移实战 本文基于 MikroORM 仓库中 docs/versioned_docs/versio后端上一篇解决Windows设备管理难题HidHide内核级过滤技术深度解析下一篇3分钟掌握GB/T 7714—2015引用规范终极CSL样式库指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表