mikro-orm 用于 TypeScript:完整指南及示例
\n\n1. 这是什么以及为什么需要它?
\n\nMikro-ORM 是一个用于 TypeScript 和 JavaScript (Node.js) 的现代对象关系映射库 (ORM),它实现了 Identity Map 和 Unit of Work 模式。与 TypeORM 或 Sequelize 等经典 ORM 不同,Mikro-ORM 受 Doctrine (PHP) 和 Hibernate (Java) 启发,提供了更可预测的实体状态管理及其与数据库的同步方式。\n
\n\n为什么需要它?在典型的 Web 应用程序中,开发人员经常遇到“脏”数据的问题,即同一条记录在代码的不同位置被加载两次,从而导致保存时发生冲突。Mikro-ORM 通过 Identity Map 解决了这个问题:对于每个主键,在一个上下文 (EntityManager) 内只存在一个实体实例。这保证了您始终使用对象的当前版本,并且所有更改都会被自动跟踪。\n
\n\n该库支持多种数据库管理系统 (PostgreSQL, MySQL, SQLite, MongoDB, MariaDB),并提供了强大的工具:迁移、内置事务支持、级联操作、关系加载 (eager/lazy)、内置模式验证器以及从现有数据库生成实体的功能。Mikro-ORM 非常适合复杂领域模型和微服务架构,在这些场景中数据一致性至关重要。\n
\n2. 安装
\n要安装 Mikro-ORM 和所需的数据库驱动程序,请通过 npm (或 yarn/pnpm) 执行命令:
\n# 安装核心库\nnpm install @mikro-orm/core\n\n# 为您的数据库安装驱动程序 (选择一个):\nnpm install @mikro-orm/sqlite # SQLite\nnpm install @mikro-orm/postgresql # PostgreSQL\nnpm install @mikro-orm/mysql # MySQL / MariaDB\nnpm install @mikro-orm/mongodb # MongoDB\n\n# 可选:用于迁移和模式生成的 CLI\nnpm install @mikro-orm/cli\nnpm install @mikro-orm/migrations # 用于迁移\n\n还建议安装 reflect-metadata 以支持装饰器:
npm install reflect-metadata\n\n在 tsconfig.json 中添加:
{\n "compilerOptions": {\n "experimentalDecorators": true,\n "emitDecoratorMetadata": true,\n "target": "ES2021",\n "module": "commonjs"\n }\n}\n\n3. 快速入门 — 最小工作示例
\n让我们创建一个使用 SQLite 的简单应用程序,其中包含一个 User 实体。
步骤 1. 定义实体 (entities/User.ts):
import { Entity, PrimaryKey, Property } from '@mikro-orm/core';\n\n@Entity()\nexport class User {\n @PrimaryKey()\n id!: number;\n\n @Property()\n name!: string;\n\n @Property()\n email!: string;\n\n @Property()\n createdAt: Date = new Date();\n}\n\n\n步骤 2. 配置 Mikro-ORM (index.ts):
import 'reflect-metadata';\nimport { MikroORM } from '@mikro-orm/core';\nimport { SqliteDriver } from '@mikro-orm/sqlite';\nimport { User } from './entities/User';\n\nasync function main() {\n const orm = await MikroORM.init({\n entities: [User],\n dbName: 'test.db',\n driver: SqliteDriver,\n debug: true, // 记录 SQL 查询\n });\n\n // 创建模式 (在开发模式下)\n await orm.getSchemaGenerator().createSchema();\n\n // 获取 EntityManager\n const em = orm.em.fork();\n\n // 创建用户\n const user = em.create(User, {\n name: '伊万',\n email: 'ivan@example.com',\n });\n await em.flush(); // 保存到数据库\n\n // 读取用户\n const found = await em.findOne(User, { emai