基于 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 数据库。
[](https://npmx.dev/package/@mikro-orm/core)
[](https://npmx.dev/package/@mikro-orm/core)
[](https://discord.gg/w8bjxFHS7X)
[](https://npmx.dev/package/@mikro-orm/core)
[](https://coveralls.io/r/mikro-orm/mikro-orm?branch=master)
[](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)。