mikro-orm/mikro-orm

GitHub: mikro-orm/mikro-orm

基于 Data Mapper 和 Unit of Work 模式的 Node.js TypeScript ORM,支持多种主流关系型与文档数据库。

Stars: 9084 | Forks: 644

MikroORM

基于 Data Mapper、[工作单元](https://mikro-orm.io/docs/unit-of-work/)和[身份映射](https://mikro-orm.io/docs/identity-map/)模式的 Node.js TypeScript ORM。支持 MongoDB、MySQL、MariaDB、PostgreSQL(包括 CockroachDB 和 PGlite)、SQLite(包括 libSQL)、MSSQL 和 Oracle 数据库。 [![NPM version](https://img.shields.io/npm/v/@mikro-orm/core.svg)](https://npmx.dev/package/@mikro-orm/core) [![NPM dev version](https://img.shields.io/npm/v/@mikro-orm/core/next.svg)](https://npmx.dev/package/@mikro-orm/core) [![Chat on discord](https://img.shields.io/discord/1214904142443839538?label=discord&color=blue)](https://discord.gg/w8bjxFHS7X) [![Downloads](https://img.shields.io/npm/dm/@mikro-orm/core.svg)](https://npmx.dev/package/@mikro-orm/core) [![Coverage Status](https://img.shields.io/coveralls/mikro-orm/mikro-orm.svg)](https://coveralls.io/r/mikro-orm/mikro-orm?branch=master) [![Build Status](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/a846b6c069160509.svg)](https://github.com/mikro-orm/mikro-orm/actions?workflow=tests) ## 快速开始 为您的数据库安装相应的驱动包: ``` npm install @mikro-orm/postgresql # PostgreSQL npm install @mikro-orm/pglite # PGlite (embedded PostgreSQL in WASM) npm install @mikro-orm/mysql # MySQL npm install @mikro-orm/mariadb # MariaDB npm install @mikro-orm/sqlite # SQLite npm install @mikro-orm/libsql # libSQL / Turso npm install @mikro-orm/mongodb # MongoDB npm install @mikro-orm/mssql # MS SQL Server npm install @mikro-orm/oracledb # Oracle ``` ### 定义实体 推荐使用 [`defineEntity`](https://mikro-orm.io/docs/define-entity) 和 `setClass` 来定义实体: ``` import { defineEntity, p, MikroORM } from '@mikro-orm/postgresql'; const AuthorSchema = defineEntity({ name: 'Author', properties: { id: p.integer().primary(), name: p.string(), email: p.string(), born: p.datetime().nullable(), 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); ``` 你也可以使用[装饰器](https://mikro-orm.io/docs/using-decorators)或 [`EntitySchema`](https://mikro-orm.io/docs/define-entity#entityschema-low-level-api) 来定义实体。有关所有选项,请参阅[定义实体指南](https://mikro-orm.io/docs/defining-entities)。 ### 初始化与使用 ``` import { MikroORM, RequestContext } from '@mikro-orm/postgresql'; const orm = await MikroORM.init({ entities: [Author, Book], dbName: 'my-db', }); // Create new entities const author = orm.em.create(Author, { name: 'Jon Snow', email: 'snow@wall.st', }); const book = orm.em.create(Book, { title: 'My Life on The Wall', author, }); // Flush persists all tracked changes in a single transaction await orm.em.flush(); ``` ### 查询 ``` // Find with relations const authors = await orm.em.findAll(Author, { populate: ['books'], orderBy: { name: 'asc' }, }); // Type-safe QueryBuilder const qb = orm.em.createQueryBuilder(Author); const result = await qb .select('*') .where({ books: { title: { $like: '%Wall%' } } }) .getResult(); ``` ### 请求上下文 在 Web 应用程序中,使用 `RequestContext` 来隔离每个请求的身份映射: ``` const app = express(); app.use((req, res, next) => { RequestContext.create(orm.em, next); }); ``` 关于 `RequestContext` 的更多信息请参阅[这里](https://mikro-orm.io/docs/identity-map/#request-context)。 ## 工作单元 当你调用 `em.flush()` 时,所有计算出的更改都将在一个数据库事务中执行。这意味着你只需通过修改实体并在准备好时调用 `flush()`,即可轻松控制事务边界。 ``` const author = await em.findOneOrFail(Author, 1, { populate: ['books'], }); author.name = 'Jon Snow II'; author.books.getItems().forEach(book => book.title += ' (2nd ed.)'); author.books.add(orm.em.create(Book, { title: 'New Book', author })); // Flush computes change sets and executes them in a single transaction await em.flush(); ``` 上面的 flush 操作将执行: ``` begin; update "author" set "name" = 'Jon Snow II' where "id" = 1; update "book" set "title" = case when ("id" = 1) then 'My Life on The Wall (2nd ed.)' when ("id" = 2) then 'Another Book (2nd ed.)' else "title" end where "id" in (1, 2); insert into "book" ("title", "author_id") values ('New Book', 1); commit; ``` ## 核心功能 - [简洁明了的实体定义](https://mikro-orm.io/docs/defining-entities) — 装饰器、`EntitySchema` 或 `defineEntity` - [身份映射](https://mikro-orm.io/docs/identity-map)和[工作单元](https://mikro-orm.io/docs/unit-of-work) — 自动变更追踪 - [实体引用](https://mikro-orm.io/docs/entity-references)和[集合](https://mikro-orm.io/docs/collections) - [QueryBuilder](https://mikro-orm.io/docs/query-builder) 和 [Kysely 集成](https://mikro-orm.io/docs/kysely) - [事务](https://mikro-orm.io/docs/transactions)和[级联](https://mikro-orm.io/docs/cascading) - [填充关联](https://mikro-orm.io/docs/populating-relations)和[加载策略](https://mikro-orm.io/docs/loading-strategies) - [过滤器](https://mikro-orm.io/docs/filters)和[生命周期钩子](https://mikro-orm.io/docs/events#hooks) - [Schema 生成器](https://mikro-orm.io/docs/schema-generator)和[迁移](https://mikro-orm.io/docs/migrations) - [实体生成器](https://mikro-orm.io/docs/entity-generator)和[数据填充](https://mikro-orm.io/docs/seeding) - [Embeddables](https://mikro-orm.io/docs/embeddables)、[自定义类型](https://mikro-orm.io/docs/custom-types)和[序列化](https://mikro-orm.io/docs/serializing) - [复合键和外键作为主键](https://mikro-orm.io/docs/composite-keys) - [实体构造函数](https://mikro-orm.io/docs/entity-constructors)和[属性验证](https://mikro-orm.io/docs/property-validation) - [关系建模](https://mikro-orm.io/docs/relationships)和[原生 JS 支持](https://mikro-orm.io/docs/usage-with-js) ## 文档 MikroORM 文档包含在本仓库的根目录中,使用 [Docusaurus](https://docusaurus.io) 构建,并公开托管在 GitHub Pages 上:https://mikro-orm.io。 还有基于提交信息(通过 `semantic-release`)自动生成的 [CHANGELOG.md](CHANGELOG.md) 文件。 ## 示例集成 你可以在 [`mikro-orm-examples` 仓库](https://github.com/mikro-orm/mikro-orm-examples)中找到一些流行框架的示例集成: ### TypeScript 示例 - [Express + MongoDB](https://github.com/mikro-orm/express-ts-example-app) - [Nest + MySQL](https://github.com/mikro-orm/nestjs-example-app) - [RealWorld 示例应用 (Nest + MySQL)](https://github.com/mikro-orm/nestjs-realworld-example-app) - [Koa + SQLite](https://github.com/mikro-orm/koa-ts-example-app) - [GraphQL + PostgreSQL](https://github.com/driescroons/mikro-orm-graphql-example) - [Inversify + PostgreSQL](https://github.com/PodaruDragos/inversify-example-app) - [NextJS + MySQL](https://github.com/jonahallibone/mikro-orm-nextjs) - [Accounts.js REST 和 GraphQL 身份验证 + SQLite](https://github.com/darkbasic/mikro-orm-accounts-example) - [Nest + Shopify + PostgreSQL + GraphQL](https://github.com/Cloudshelf/Shopify_CSConnector) - [Elysia.js + libSQL + Bun](https://github.com/mikro-orm/elysia-bun-example-app) - [Electron.js + PostgreSQL](https://github.com/adnanlah/electron-mikro-orm-example-app) ### JavaScript 示例 - [Express + SQLite](https://github.com/mikro-orm/express-js-example-app) ## 作者 **Martin Adámek** - Twitter: [@B4nan](https://twitter.com/B4nan) - Github: [@b4nan](https://github.com/b4nan) 另请参阅[参与](https://github.com/mikro-orm/mikro-orm/contributors)该项目的贡献者列表。 ## 许可证 版权所有 © 2018-present [Martin Adámek](https://github.com/b4nan)。 本项目基于 MIT 许可证授权 — 详见 [LICENSE 文件](LICENSE)。
标签:Data Mapper, GNU通用公共许可证, MITM代理, Node.js, ORM, TypeScript, 安全插件, 数据库, 测试用例, 自动化攻击