egg.js(MySQL)的应用

 以下方法声明在/app/controller中创建的js文件中使用。

数据库的引用(要先在egg中引入和配置好sequlize):

await ctx.model.User.create //User为数据库中的表名, create为方法,引入model文件夹下的user.js文件。  下面内容亦同

1.db增加数据 (create)

async abc(){
  const {ctx}=this;
  try{
    await ctx.model.User.create({
      username:'名字1',
      phone:'1384654214',
      pwd:123456,
      balance:0
    })
    ctx.body="添加成功"
  }catch(e){
    ctx.body={success:false,info:e}
  }

}

函数名自定义为abc,在路由(router.js)中使用调用该方法。

例如:

router.post('/abc',controller.home.abc);

//上方调用代码的含义:controller目录下的home.js文件的abc函数 

post请求,在Eolinker软件下访问. get请求可在浏览器URL路径下直接访问。

2. db删除(destroy)

async efg(){
  const {ctx}=this;
  try{
    await ctx.model.User.destroy({
      where:{
        uid:1
      }
    })
    ctx.body={success:true,info:'ok'}
  }catch(e){
    ctx.body={success:false,info:e}
  }
}

3.db改(update)

async doupdate(){
  const{ctx}=this;
  try {
    await ctx.model.User.update({
      phone:'110',
      username:'老刘'
    },{
      where:{
        uid:4
      }
    })
    ctx.body="更新成功!"
  } catch (error) {
    ctx.body="更新失败"+error;
  }
}

4.db查

(1)findByPk() 

findByPk(主键的值,配置项) 根据主键来查找一个 ,返回的是单个 行实例 找不到返回null

async hij(){
  const {ctx,app}=this;
  try {
    const res=await ctx.model.User.findByPk(2);
    ctx.body=res;
  } catch (error) {
    ctx.body="错误信息"+error;
  }
}

(2)findOne()

 findOne(配置项)找不到也是返回 null

async hij(){
  const {ctx,app}=this;
  try {
    const  res=await ctx.model.User.findOne({
    where:{
      phone:'1384654214',
      username:'老张' 
    }
  })
  ctx.body=res;
  } catch (error) {
    ctx.body="错误信息"+error;
  }
}

(3)findAll()

async hij(){
  const {ctx,app}=this;
  try {
   const { Op }=app.Sequelize;
  const  res=await ctx.model.User.findAll({
    where:{
      phone:{ [Op.like]:'%1%' }   //gt 大于  lt 小于
    }
  })
  ctx.body=res;
  } catch (error) {
    ctx.body="错误信息"+error;
  }
}

可限定条件:

limit:2   限制返回的记录数

offset:1 查询的起点  从第几个开始查

attributes:['uid','phone'],   //写法1 限定返回的信息  例:只返回uid phone

attributes:{

    exclude:['pwd']     //写法2 排除要查询的字段

 }

order:[['uid','DESC']],       //ASC顺序  DESC倒序(常用)

(4) 行实例  对应的是某一行  查+改

async hij(){
    const {ctx}=this;
    try {
      const one=await ctx.model.User.findByPk(4);
      await one.update({username:'老阳'});
      ctx.body=one;
      
    } 
    catch (error) {
      ctx.body='错误信息:'+error;
    }
  }

await one.destroy();              //删除那一行

await one.increment('balance',{by:5});  //对应行的balance加上5

await one.reload();//reload()加载到最新的状态  increment和decrement如果想获取最新状态,用reload()

5.实现批量创建( bulkCreate([ ]) )

async creates(){
    const {ctx}=this;
    try {
      const res= await ctx.model.User.bulkCreate([
        {username:'老鲁',
          uid:5,
          phone:'12354',
          money:23
        },
        {username:'老秦',
          uid:6,
          phone:'12357898',
          money:230
        }
      ])

      ctx.body=res;
    } catch (error) {
      ctx.body='错误信息:'+error;
    }
  }

6.findOrCreate({ })

async foc(){
    const {ctx}=this;
    try {
      const res=await ctx.model.User.findOrCreate({
        where:{
          uid:7,
        },
        defaults:{
          username:'老周',
          phone:'911',
          money:45,
         
        }
        // attributes:{
        //   exclude:['money']
        // }
      })
      ctx.body=res;
    } catch (error) {
      ctx.body='出错信息:'+error;
    }

  }

defaults:如果需要创建的话,需要带上字段的内容,并且主键(uid)不能冲突,如果uid已存在,则是查询。

7.sum与count方法  (常用)        

sum('求和字段',配置项)

max('字段',配置项) 返回指定字段的最大值

min('字段',配置项) 返回指定字段的最小值

count(配置项) 返回符合条件的记录数的数量值

对字段money大于60的进行money求和 

async num(){
    const {ctx,app}=this;
    try {
      const {Op}=app.Sequelize;
      const res=await ctx.model.User.sum('money',{
        where:{
          money:{[Op.gt]:60}
        }
      })
      ctx.body='总数:'+res;
    } catch (error) {
      ctx.body='错误信息:'+error;
    }
  }

8.belongsTo  

要查询的源表.belongsTo(要关联的目标表,{foreignKey:'外键的字段',targetKey:'主键的字段')

belongsTo是 一对一关键 而且 外键是在 要查询额源表上面(外键uid在订单表上)

async belong(){
    const {ctx,app}=this;
    try {
      await this.ctx.model.Order.belongsTo(ctx.model.User,{foreignKey:'uid',targetKey:'uid'});
      const orderinfo=await ctx.model.Order.findAll({
      include:[ctx.model.User]
      });
      ctx.body=orderinfo;
    } catch (error) {
      this.ctx.body='出错信息:'+error;
    }
  }

9.hasMany/hasOne

hasMany是一对多 而且外键是在要关联的目标表上面(外键uid在订单表),   hasOne 一对一 

include写法1:

async has(){
    const {ctx,app}=this;
    try {
      
      await ctx.model.User.hasMany(ctx.model.Order,{foreignKey:'uid',targetKey:'uid'});
      await ctx.model.User.hasOne(ctx.model.Address,{foreignKey:'uid',targetKey:'uid'});
      const userinfo=await ctx.model.User.findAll({
        include:[ctx.model.Order,ctx.model.Address]
      })
      ctx.body=userinfo;
    } catch (error) {
      this.ctx.body='出错信息:'+error;
    }
  }

include写法2:

async has(){
    const {ctx,app}=this;
    try {
      
      await ctx.model.User.hasMany(ctx.model.Order,{foreignKey:'uid',targetKey:'uid'});
      await ctx.model.User.hasOne(ctx.model.Address,{foreignKey:'uid',targetKey:'uid'});
      const userinfo=await ctx.model.User.findAll({
        // include:[ctx.model.Order,ctx.model.Address]

        include:[
          {
            model:ctx.model.Address,
          },
          {
            model:ctx.model.Order,
            attributes:{
              exclude:['oid']
            }
          }
        ],
       
      })
      ctx.body=userinfo;
    } catch (error) {
      this.ctx.body='出错信息:'+error;
    }
  }

 

10.聚合函数

 聚合函数,用来求和或者求个数

 SUM求和

使用方法:

        [app.Sequelize.fn('聚合函数 SUM求和  COUNT统计个数',app.Sequelize.col('字段')),'别名']

group:按哪个字段分组

async jhhs(){
    const {ctx,app}=this;

    try {
      const userinfo=await ctx.model.Order.findAll({
        attributes:[
          // 'uid',
          [app.Sequelize.fn('SUM',app.Sequelize.col('price')),'total']
        ],
        // group:'uid'
      })
      ctx.body=userinfo;

    } catch (error) {
      this.ctx.body='出错信息:'+error;
    }

    
  }

 

你可能感兴趣的:(nodejs,javascript,css,node.js,npm)