@kne/fastify-sequelize
Version:
Fastify与Sequelize的深度集成插件,支持自动模型加载和分布式ID生成
188 lines (147 loc) • 4.7 kB
Markdown
# fastify-sequelize
### 描述
Fastify与Sequelize的深度集成插件,支持自动模型加载和分布式ID生成
### 安装
```shell
npm i --save @kne/fastify-sequelize
```
### 概述
#### 核心功能概述
1. **ORM 集成**
- 无缝集成 Sequelize ORM 到 Fastify 框架
- 支持多种数据库(SQLite/MySQL/PostgreSQL等)
2. **自动化模型管理**
- 自动扫描指定目录下的模型文件
- 支持动态添加模型
- 自动处理模型关联关系
3. **分布式ID生成**
- 内置雪花算法ID生成器
- 可配置的基准时间和实例ID
#### 详细配置说明
##### 数据库连接配置
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| dialect | string | 是 | 'sqlite' | 数据库类型 |
| database | string | 否 | null | 数据库名称 |
| username | string | 否 | null | 数据库用户名 |
| password | string | 否 | null | 数据库密码 |
| host | string | 否 | 'localhost' | 数据库地址 |
| port | number | 否 | 数据库默认端口 | 连接端口 |
##### 高级配置选项
```javascript
{
// 雪花ID生成配置
snowflake: {
instance_id: 1, // 分布式ID实例编号(0-1023)
custom_epoch: 1672531200000 // 基准时间戳(2024-01-01)
},
// 数据库同步配置
syncOptions: {
force: false, // 强制同步(会删除原有表结构)
alter: true // 安全模式自动修改表结构
},
// 模型加载配置
modelsPath: './models', // 模型文件存放路径
prefix: 't_', // 数据库表名前缀
name: 'models' // Fastify实例上的挂载名称
}
```
#### 模型定义规范
##### 基础模型示例
```javascript
// models/user.js
module.exports = ({ DataTypes }) => ({
name: 'User',
model: {
username: {
type: DataTypes.STRING(32),
allowNull: false,
unique: true
},
age: {
type: DataTypes.INTEGER,
defaultValue: 18
}
},
options: {
timestamps: true // 启用时间戳
}
});
```
##### 关联模型示例
```javascript
// models/post.js
module.exports = ({ DataTypes }) => ({
name: 'Post',
model: {
title: DataTypes.STRING,
content: DataTypes.TEXT
},
associate(db) {
db.Post.belongsTo(db.User, {
foreignKey: 'authorId',
as: 'author'
});
}
});
```
#### 最佳实践建议
1. **开发环境配置**
```javascript
fastify.register(fastifySequelize, {
db: {
dialect: 'sqlite',
storage: './dev.db'
},
syncOptions: {
alter: true // 开发时自动同步表结构
}
});
```
2. **生产环境配置**
```javascript
fastify.register(fastifySequelize, {
db: {
dialect: 'mysql',
host: 'db.prod.com',
database: 'prod_db',
username: 'admin',
password: 'securePassword123'
},
syncOptions: {
alter: false // 生产环境禁用自动修改
}
});
```
3. **迁移策略**
- 开发阶段可使用 `force: true` 快速重置数据库
- 生产环境建议使用 Sequelize 迁移工具
- 重要变更应通过手动迁移脚本执行
> 注意:雪花ID的基准时间建议设置为项目启动日期,instance_id 在分布式环境中需要确保唯一
### 示例
#### 示例代码
### API
### 配置选项
| 配置项 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `db.dialect` | string | `'sqlite'` | 数据库类型 (mysql/postgres/sqlite等) |
| `db.username` | string | `null` | 数据库用户名 |
| `db.password` | string | `null` | 数据库密码 |
| `snowflake.instance_id` | number | `1` | 雪花ID生成器实例ID |
| `snowflake.custom_epoch` | number | `2024-01-01时间戳` | 雪花ID基准时间 |
| `modelsPath` | string | `'./models'` | 模型文件存放路径 |
| `prefix` | string | `'t_'` | 数据库表名前缀 |
| `name` | string | `'models'` | 在fastify实例上的挂载名称 |
### 实例属性/方法
| 属性/方法 | 类型 | 描述 |
|----------|------|------|
| `addModels` | Function | 用于添加 Sequelize 模型的函数 |
| `Sequelize` | Object | Sequelize 库的引用 |
| `[config.name]` | Object | 动态命名的模型集合,当 `config.modelsPath` 是目录时加载的模型 |
| `instance` | Sequelize | Sequelize 实例的引用 |
| `generateId` | Function | 生成唯一 ID 的函数(使用 snowflake 算法) |
| `sync` | Async Function | 同步所有模型到数据库的方法 |
#### `sync` 方法详情
| 参数 | 类型 | 默认值 | 描述 |
|------|------|--------|------|
| `options` | Object | `{}` | Sequelize 同步选项,会与 `config.syncOptions` 合并 |