npm package: @fly_dream/sequelize-connection
Description: sequelize 数据库连接管理库
Author: Tenny
Latest version: 0.0.1

# sequelize-connnection

`Sequelize` 连接管理, 支持多连接。

## 安装

```shell
npm install @fly_dream/sequelize-connnection
```

## 使用

### 1. 基本使用

```js
import { connect } from '@fly_dream/sequelize-connnection';

await connect({
  connections: {
    default: {
      uri: '',
      modelInitFns: [],
    },
  },
});
```

### 2. 多个连接

```js
import { connect } from '@fly_dream/sequelize-connnection';

await connect({
  connections: {
    // 连接1, 默认连接
    default: {
      uri: '',
      modelInitFns: [],
    },
    // 连接2
    conn1: {
      uri: '',
      modelInitFns: [],
    },
  },
});
```

### 3. 配置日志

```typescript
import { connect } from '@fly_dream/sequelize-connnection';

await connect({
  // 日志记录的函数
  logger: (sql: string, time?: number) => logger.debug(sql)
  connections: {
    default: {
      uri: '',
      modelInitFns: [],
      logger: (sql: string, time?: number) => logger.debug(sql)
    }
  }
}
```

配置在 `connections` 里面的 `logger` 是每一个连接的日志; 如果不填则会使用 `connections` 外面的全局的 `logger` 配置。

### 4. 读写分离

```typescript
import { connect } from '@fly_dream/sequelize-connnection';

await connect({
  connections: {
    default: {
      modelInitFns: [],
      replication: {
        // 配置读
        read: [{ host: 'localhost', username: 'user', password: 'pwd' }],
        // 配置写
        write: { host: 'localhost', username: 'user', password: 'pwd' },
      },
    },
  },
});
```

### 5. 在 `fastify` 中使用

```typescript
import { connect } from '@fly_dream/sequelize-connnection';

register_fastify(app, {
  uri: '',
  modelInitFns: [],
});
```

### 6. 配置模型初始化函数

1. 定义模型

```typescript
// model.ts

import { DataTypes, Model } from 'sequelize';

/** 用户表 */
export class User extends Model {}

/**
 * 初始化模型
 * @param {object} sequelize
 * @param {string} charset - 字符编码, utf8mb4
 */
export function initModels(sequelize: Sequelize, charset: string) {
  User.init(..., { charset })
}
```

2. 配置连接

```typescript
import { connect } from '@fly_dream/sequelize-connnection';
import { initModels } from './models';

await connect({
  connections: {
    default: {
      uri: '',
      modelInitFns: [initModels],
    },
  },
});
```

## API

### 1. `connect(options): Promise<void>`

初始化连接，并执行初始化函数。

#### 参数

- `options`：`object`
  - `logger`: `boolean` | `(sql, time) => void`
  - `connections`：`object`
    - `default`：`object`
      - `uri`：`string`
      - `modelInitFns`：`Array<() => void>`

`logger` 配置为 `true` 时, 使用 `console.log` 记录日志

`connections` 中的 `key` 指定连接名称， `value` 连接配置, 在 [sequelize-api](https://sequelize.org/api/v6/class/src/sequelize.js~sequelize#instance-constructor-constructor) 的基础上增加了 `uri`、`modelInitFns`、`logger` 三个配置项

#### 示例

```js
import { connect } from '@fly_dream/sequelize-connnection';

const config = {
  logger: true,
  connections: {
    default: {
      uri:'mysql://root:root@localhost:3306/test',
      modelInitFns: [
        () => {
          // 自定义模型初始化函数
      ]
    }
  }
}

await connect(config);
```

### 2. `register_fastify(app, config)`

用于在 `fastify` 中使用, 默认使用 `app.log.debug` 记录 SQL 日志; 同时在 `app.close` 的时候, 会自动关闭所有连接

### 3. `connection(name = 'default')`

获取某个 `Sequelize` 连接实例

### 4. `closeAll(): Promise<void>`

断开所有的数据库连接, 通常用于在应用退出时使用