一、安装
安装并配置egg-sequelize插件(它会辅助我们将定义好的Model对象加载到app和ctx上) 和 mysql2模块
- 1、安装
npm install --save egg-sequelize mysql2
- 2、在config/plugin.js中引入egg-sequelize插件
exports.squelize = {
enable:true,
package:'egg-sequelize'
}
- 3、在config/config.default.js
config.sequelize = {
dialect:'mysql',
host:'127.0.0.1',
username:'root', // 改成自己对应的配置
password:'root',
port:3306,
database:'eggapi',
// 中国时区
timezone:'+08:00',
define:{
// 取消数据表名复数
freezeTableName:true,
// 自动写入时间戳
timestamps:true,
//字段生成软删除时间戳 deleted_at
paranoid:true,
createdAt:'created_at',
updatedAt:'updated_at',
deletedAt:'deleted_at',
// 所有驼峰命名格式化
underscored:true
}
}
upupwank数据库管理工具,类似navicat
工具下载地址:upupwank下载地址
- 4、sequelize 提供了 sequelize-cli工具来实现 Migrations,我们也可以在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/mode')
}
- 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":"eggapi",
"host":"127.0.0.1",
"dialect":"mysql",
"timezone":"+08:00"
}
}
- 8、创建数据库
npx sequelize db:create
创建数据迁移表
npx sequelize migration:generate --name=init-user
- 1、执行完命令后,会在database/migrations/目录下生成数据表迁移文件,然后定义:
'use strict'
module.exports = {
up:async(queryInterface,sequelize) =>{
const {INTEGER,STRING,DATE,ENUM} = sequelize;
// 创建表
await queryInterface.createTable('user',{
id:{
type:INTEGER(20).UNSIGNED, // int类型,长度20,无符号,即非负数
primaryKey:true, // 主键
autoIncrement:true // 自增
},
username:{
type:STRING(30),
allowNull:false, // 不允许为空
defaultValue:'',
comment:'用户名', // 备注
unique:true
},
avatar_url:{
type:STRING(200),
allowNull:true,
defaultValue:''
},
sex:{
type:ENUM,
value:['男','女','保密'],
allowNull:true,
defaultValue:'男',
comment:'用户性别'
},
created_at:DATE,
updated_at:DATE
})
},
down:async queryInterface =>{
await queryInterface.dropTable('user')
}
}
- 执行migrate进行数据库变更
# 升级数据库
npx sequelize db:migrate
# 如果有问题需要回滚,可以通过 ' db:migrate:undo'回滚一个变更
# npx sequelize db:migrate:undo
# 可以通过 ` db:migrate:undo:all ` 回滚到初始状态
# npx sequelize db:migrate:undo:all
模型
创建模型
// app/model/user.js
'use strict'
modules.exports = app =>{
const {STRINGN,INTEGER,DATE,ENUM} = app.Sequelize
// 配置(重要:一定要配置详细,一定!!!)
const User = app.model.define('user',{
id:{
type:INTEGER(20).UNSIGNED,
primaryKey:true,
autoIncrement:true,
},
username:{
type:STRING(30),
allowNull:false,
defaultValue:'',
comment:'用户名',
unique:true // 唯一且不重复
},
password:{
type:STRING(200),
allowNull:false,
defaultValue:''
},
avatar_url:{
type:STRING(200),
allowNull:true,
defaultValue:''
},
sex:{
type:ENUM,values:['男','女','保密'],
allowNull:true,
defaultValue:'男',
comment:'用户性别',
},
created_at:DATE,
updated_at:DATE
},
// 下面2项可以注释,config.default.js中有全局配置自动写入时间戳
{
timestamps:true, //是否自动写入时间戳
tableName:'user' // 自定义数据表名称
// 是否需要增加createdAt,updatedAt,deletedAt字段
'timestamps':true,
// 不需要createdAt字段
'createdAt':false,
// 将updatedAt字段改个名
'updatedAt':'utime',
// 将deletedAt字段改名
// 同时需要设置paranoid为true(此种模式下,删除数据不会进行物理删除,而是设置deletedAt为当前时间)
'deletedAt':'dtime',
'paranoid':true
}
);
// 更新表结构
User.sync({force:true})
return User;
}
如果对已创建的表结构进行更新时,可使用:
表模型.sync({force:true}),如上
往表模型中插入一条数据
这个Model就可以在Controller和Service中通过app.model.user 或者 ctx.model.user 访问到。
例如我们编写app/controller/user.js
const Controller = require('egg').Controller
class UserController extends Controller{
async create(){
let {username,password,avatar_url,sex} = this.ctx.request.body
// 往user表中插入一条数据
let res = await this.ctx.model.User.create({
username:username,
password:password,
avatar_url:avatar_url,
sex
})
this.ctx.body = res
}
}
app/router/user.js表配置路由:
module.exports = app =>{
const {router,controller} = app
router.get('/api/user/index',controller.user.index)
router.post('/api/user/create',controller.user.create)
// router.post('/api/user/getUserInfo',controller.user.getUserInfo)
/**
* @description:资源路由分组
*
*/
// router.resources('user','/api/user',controller.user)
}
下面就可以通过postman发送post请求添加数据了
现在去数据库中验证是否插入一条数据成功: