数据持久化

ORM(对象关系映射)
  • 对象关系映射(Object Relational Mapping,简称ORM)
  1. 将数据从对象形式转化为表格形式
  2. sequelize是一个基于node的orm框架
  3. 通过egg-sequelize,可以直接使用sequelize提供方法操作数据库,不用手写sql语句
egg项目使用sequleize
  • 下载egg-sequelize
	npm insatll --save egg-sequelize msyql2
  • 在config/plugin.js文件引入插件
	module.exports = {
	sequelize:{
    enable:true,
    package:'egg-sequelize'
	  }
	};
  • 在config.default.js文件配置数据库连接
	config.sequelize={
	   dialect:'mysql',//数据库类型
	   database:'xxx',//数据库名称
	   host:'localhost',//连接地址
	   port:3306,//端口号
	   username:'root',//用户名
	   password:'123456',//密码
	   timezone:'+08:00',//北京时区
	 }
  • 创建数据库模型,例:创建app/model/clazz.js,对应数据库clazz表
	//默认情况下,sequelize将自动将所有传递的模型名称(define的第一个参数)转化为复数,
	//即clazz表在数据库中显示为clazzs
	module.exports= app =>{
	    const{STRING}=app.Sequelize;		
	    const Clazz = app.model.define('clazz',{
	        //自动生成id
	        name:STRING,
	    })
	
	    return Clazz;
	}
  • 添加数据库模型,初始化数据库, 根目录下创建app.js文件
	module.exports = app =>{
	    app.beforeStart(async function(){
      		//await app.model.sync({force:true});
       		//开发环境使用会删除数据表,重启删除表,按模型新建
	        await app.model.sync({});
         	//sync方法会根据模型(app/model文件夹下的模型)创建表
	    });
	};
  • 操作数据库,例:创建controller/clazz.js文件 ,无异常处理
	const Controller = require('egg').Controller
	class Clazz extends Controller{
	    async index(){
	        let id = this.ctx.request.query.id
	        //拿到get请求参数
	        let list = await this.app.model.Clazz.findAll({
	            where:{id:id}
	        })
	        //根据拿到的参数,查询数据库信息
	        this.ctx.body=list
	        //把查询的数据库的信息返回给请求
	    }//查询数据
	    async create(){
	        let name = this.ctx.request.body.name
	        await this.app.model.Clazz.create({
	            name:name//左边是数据库中要添加的,右边是拿到的请求数据
	        })
	        this.ctx.body="添加成功"
	    }//添加数据
	    async update(){
	        let id = this.ctx.params.id
	        let name = this.ctx.request.body.name
	        await this.app.model.Clazz.update({name:name},{
	            where:{
	                id:id
	            }})
	        this.ctx.body="修改成功"
	    }//修改数据
	    async destroy(){
	        let id = this.ctx.params.id
	        await this.app.model.Clazz.destroy({
	            where:{id:id}
	        })
	        this.ctx.body="删除成功"
	    }//删除数据
	}
	module.exports = Clazz
  • 添加外键,例:创建app/model/student.js
	module.exports = app => {
	    const { STRING,DOUBLE } = app.Sequelize;
	    const Student = app.model.define('student', {
	        //自动生成id
	        name: STRING,
	        achievement: DOUBLE
	    })
	    Student.associate = function(){//所属哪个班级,指向班级主键
	        app.model.Student.belongsTo(app.model.Clazz,{
	            foreignKey:'clazz_id',
	            as:'clazz'
	        })
	    }
	    return Student;
	}
  • 操作包含外键数据库,例:创建controller/student.js文件
	const Controller = require('egg').Controller
	class Student extends Controller{
	    async index(){
	        let id = this.ctx.request.query.id
	        let list = await this.app.model.Student.findAll({
	            where:{id:id}
	        })
	        this.ctx.body=list
	    }	
	    async create(){
	        let name=this.ctx.request.body.name
	        let achievement= this.ctx.request.body.achievement
	        let clazz_id = this.ctx.request.body.clazz_id
	        await this.app.model.Student.create({
	            name:name,
	            achievement:achievement,
	            clazz_id:clazz_id
	        })
	        this.ctx.body="添加成功"
	    }
	    async update(){
	    }
	    async destroy(){
	    }
	}
module.exports = Student
Mysql数据类型与sequelize数据类型对应如下
	1. STRING => varchar(255)
	2. INTEGER => int
	3. DOUBLE => double
	4. DATA => datatime
	5. TEXT => text
数据操作(在controller中实现数据增删改查)
	//项目中,操作数据库的逻辑要和controller分开
	//这里的Clazz是指要操作的数据模型
	this.app.model.Clazz.findAll()//查询,findAll找到所有数据
	this.app.model.Clazz.findAll({where:{id:1}})//where设置查询条件	
	this.app.model.Clazz.create({ name:"xx" })//添加数据
	this.app.model.Clazz.update({ name:"xx"},{ where:{ id:1 }})//通过where删除
	await this.app.model.Clazz.destroy({ where:{id:id} }) //修改数据           
     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值