@zenweb/tenant
Version:
Zenweb Tenant module
171 lines (137 loc) • 3.2 kB
Markdown
[](https://www.npmjs.com/package/zenweb)
多租户多数据库支持
```bash
yarn add @zenweb/tenant
```
编辑项目入口代码 `src/index.ts`
```ts title="src/index.ts"
import { create } from 'zenweb';
import modTenant, { Tenant } from '@zenweb/tenant';
export const app = create();
/**
* 租户配置信息(代码演示)
*/
const tenantsConfig: { [id: string]: Tenant } = {
'a.demo.com': {
server: 'S1',
database: 'db_1',
},
'b.demo.com': {
server: 'S2',
database: 'db_2',
},
};
app.setup(modTenant({
tenantGetter: ctx => {
const tenant = tenantsConfig[ctx.host];
if (!tenant) {
throw new Error('Tennat not exists: ' + ctx.host);
}
return tenant;
},
pools: {
S1: { // 数据库服务器名称
MASTER: { // 主库
host: '127.0.0.1',
port: 3306,
user: 'root',
password: '123456',
charset: 'utf8mb4',
timezone: '+08:00',
connectionLimit: 100,
},
// 从库配置
// SLAVES: []
},
S2: {
MASTER: {
host: '127.0.0.1',
port: 3306,
user: 'root',
password: '',
charset: 'utf8mb4',
timezone: '+08:00',
connectionLimit: 100,
},
},
},
}));
```
使用 MySQL 原生查询
```ts title="src/controller/test.ts"
import { mapping, Context } from 'zenweb';
export class TestController {
@mappping()
dbtest(ctx: Context) {
// 默认使用主库 MASTER
await ctx.mysql.query("SELECT 1+1");
// 指定使用主库
await ctx.mysql.of("MASTER").query("SELECT 1+1");
// 指定使用从库 - 对于没有配置从库的会自动切换成主库 MASTER
await ctx.mysql.of("SLAVE*").query("SELECT 1+1");
}
}
```
```bash
yarn add zenorm
yarn add --dev @zenorm/generate @zenorm/generate-mysql
```
在 `package.json` 的 `scripts` 中增加如下代码,用于执行 `dbgen` 命令
```json title="package.json"
{
"scripts": {
"dbgen": "zenorm-generate .dbgen.js"
}
}
```
创建文件 `.dbgen.js` 用于生成数据库结构代码时连接到指定数据库
*提示:运行时并不使用此配置*
```js title=".dbgen.js"
/** @type {import("@zenorm/generate").GenerateConfig} */
module.exports = {
host: "localhost",
port: 3306,
user: "root",
password: "",
database: "zenorm_test",
outputDir: "./model",
bindQuery: true,
};
```
运行命令开始生成数据库结构代码
```bash
yarn dbgen
```
编辑项目入口代码 `src/index.ts`
```ts title="src/index.ts"
// 导入 ORM 生成的 bindQuery 方法
import { bindQuery } from './model';
// 修改配置好的 modTenant
// 集成 ZenORM
app.setup(modTenant({
// ... modTenant 配置
bindQuery, // ORM 查询绑定
});
```
```ts title="src/controller/test.ts"
import { mapping } from 'zenweb';
import { User } from '../model';
export class TestController {
@mapping()
orm() {
return User.find({ id: 1 }).get();
}
}
```