egg.js(二):egg数据库配置和迁移文件

一、安装

安装并配置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请求添加数据了
在这里插入图片描述
现在去数据库中验证是否插入一条数据成功:
在这里插入图片描述

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值