[TOC]
### egg.js 數據庫遷移
文檔:[https://eggjs.org/zh-cn/tutorials/sequelize.html](https://eggjs.org/zh-cn/tutorials/sequelize.html)
### sequelize 數據庫遷移命令
| 命令 | 含義 |
| --- | --- |
| sequelize db:migrate | 運行遷移文件 |
| sequelize db:migrate:status | 列出所有遷移的狀態 |
| sequelize db:migrate:undo | 隔離數據庫:遷移:撤消 |
| sequelize db:migrate:undo:all | 還原所有運行的遷移 |
| sequelize db:create | 創建由配置指定的數據庫 |
| sequelize db:drop | 刪除由配置指定的數據庫 |
*****
### 配置
1. 安裝并配置[egg-sequelize](https://github.com/eggjs/egg-sequelize)插件(它會輔助我們將定義好的 Model 對象加載到 app 和 ctx 上)和[mysql2](https://github.com/sidorares/node-mysql2)模塊:
~~~
npm install --save egg-sequelize mysql2
~~~
2. 在`config/plugin.js`中引入 egg-sequelize 插件
~~~
exports.sequelize = {
enable: true,
package: 'egg-sequelize',
};
~~~
3. 在`config/config.default.js`中編寫 sequelize 配置

```
config.sequelize = {
dialect: 'mysql',
host: '127.0.0.1',
password: 'xxxx',
port: 3306,
database: 'friends',
timezone: '+8:00',
define: {
freezeTableName: true
}
};
```
4. sequelize 提供了[sequelize-cli](https://github.com/sequelize/cli)工具來實現[Migrations](http://docs.sequelizejs.com/manual/tutorial/migrations.html),我們也可以在 egg 項目中引入 sequelize-cli。
~~~
npm install --save-dev sequelize-cli
~~~
5. 在 egg 項目中,我們希望將所有數據庫 Migrations 相關的內容都放在`database`目錄下,所以我們在項目根目錄下新建一個`.sequelizerc`配置文件:
~~~
'use strict';
const path = require('path');
module.exports = {
config: path.join(__dirname, 'database/config.json'),
'migrations-path': path.join(__dirname, 'database/migrations'),
'seeders-path': path.join(__dirname, 'database/seeders'),
'models-path': path.join(__dirname, 'app/model'),
};
~~~
6. 初始化 Migrations 配置文件和目錄
~~~
npx sequelize init:config
npx sequelize init:migrations
npx sequelize init:models
~~~
7. 執行完后會生成`database/config.json`文件和`database/migrations`目錄,我們修改一下`database/config.json`中的內容,將其改成我們項目中使用的數據庫配置:
~~~
{
"development": {
"username": "root",
"password": null,
"database": "egg-sequelize-doc-default",
"host": "127.0.0.1",
"dialect": "mysql",
"operatorsAliases": false
}
}
~~~
8. 創建數據庫
`npx sequelize db:create`
*****
### 創建數據遷移表
~~~
npx sequelize migration:generate --name=init-users
~~~
1.執行完命令后,會在database / migrations / 目錄下生成數據表遷移文件,然后定義
~~~
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
const { INTEGER, STRING, DATE, ENUM } = Sequelize;
// 創建表
await queryInterface.createTable('users', {
id: { type: INTEGER(20).UNSIGNED, primaryKey: true, autoIncrement: true },
username: { type: STRING(30), allowNull: false, defaultValue: '', comment: '用戶名稱', unique: true},
email: { type: STRING(160), allowNull: false, defaultValue: '', comment: '用戶郵箱', unique: true },
password: { type: STRING(200), allowNull: false, defaultValue: '' },
avatarUrl: { type: STRING(200), allowNull: true, defaultValue: '' },
mobile: { type: STRING(20), allowNull: false, defaultValue: '', comment: '用戶手機', unique: true },
prifix: { type: STRING(32), allowNull: false, defaultValue: '' },
abstract: { type: STRING(255), allowNull: true, defaultValue: '' },
gender: { type: ENUM, values: ['男','女','保密'], allowNull: true, defaultValue: '男', comment: '用戶性別'},
createdAt: DATE,
updatedAt: DATE
}, { engine: 'MYISAM' });
// 添加索引
queryInterface.addIndex('users', ['gender'])
},
down: async queryInterface => {
await queryInterface.dropTable('users')
}
};
~~~
*****
### 創建數據模型
app / model / user.js

>[danger] 引入日期處理類庫 Moment.js
> npm install moment --save
~~~
'use strict';
const moment = require('moment')
module.exports = app => {
const { STRING, INTEGER, DATE } = app.Sequelize;
const User = app.model.define('users', {
id: { type: INTEGER(20).UNSIGNED, primaryKey: true, autoIncrement: true },
username: { type: STRING(30), allowNull: false, defaultValue: '', comment: '用戶名稱', unique: true},
email: { type: STRING(160), allowNull: false, defaultValue: '', comment: '用戶郵箱', unique: true },
password: { type: STRING(200), allowNull: false, defaultValue: '' },
avatarUrl: { type: STRING(200), allowNull: true, defaultValue: '' },
mobile: { type: STRING(20), allowNull: false, defaultValue: '', comment: '用戶手機', unique: true },
prifix: { type: STRING(32), allowNull: false, defaultValue: '' },
abstract: { type: STRING(255), allowNull: true, defaultValue: '' },
gender: { type: ENUM, values: ['男','女','保密'], allowNull: true, defaultValue: '男', comment: '用戶性別'},
createdAt: {type: DATE, get() {return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss')}},
updatedAt: {type: DATE, get() {return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss')}}
});
return User;
};
~~~
- 概述
- 起步
- 跨域配置
- 路徑別名
- 路由
- api版本控制
- 錯誤和異常
- 全局異常處理
- 數據庫
- 創建遷移文件
- sequelize數據類型
- 配置
- 新增
- 查詢
- 條件查詢
- 模糊查詢
- 排序查詢
- 聚合查詢
- 分組查詢
- 分頁查詢
- 修改
- 刪除
- 獲取器
- 修改器
- 靜態屬性
- 字段驗證
- 外鍵約束
- 關聯模型
- 一對一
- 一對多
- 左外連接
- 多對多
- 字段顯示隱藏
- 事務
- 字段自增
- 驗證層
- egg-validate
- indicative驗證器
- egg-validate-plus
- betterValidate
- 校驗規則
- 中間件
- 安全
- 數據加密
- 單向加密
- 示例代碼
- 封裝egg加密
- 上傳
- path模塊
- 單文件上傳
- 多文件上傳
- 按照日期存儲
- 工具函數
- egg常用工具函數
- 緩存
- 配置緩存插件
- 設置緩存
- 獲取緩存
- 刪除緩存
- 消息隊列
- rabbitMQ
- 安裝
- 簡單隊列
- 工作隊列
- 工作隊列(dispach分發)
- 消息應答和持久化
- redis
- 數據類型
- 字符串類型(String)
- 哈希類型(Hash)
- 列表(List)
- 無序集合(Set)
- 可排序集合(Zset)
- 郵件系統
- nodeMailer
- 第三方模塊
- 生成隨機數
- JWT
- JWT鑒權
- 生成Token
- 短信服務
- 阿里大魚短信驗證碼
- 發送短信邏輯
- 阿里短信Node類