后端数据库的操作方法

2018-11-20 10:15:50

Cabloy对EggJS中的数据库操作方法进行了进一步封装和扩展,提供了以下机制:

  1. 提供ctx.db对象,可以便利的支持数据库事务
  2. 提供model对象,可以便利的支持多实例软删除

ctx.db对象

EggJS是在app对象上提供数据库连接对象,而Cabloy在ctx对象上提供数据库连接对象,便于在启动数据库事务时,在上下文环境中保持同一个数据库连接。在这里,我们先看看通过ctx.db如何完成常规的增删改查等操作

ctx.db提供的数据库操作方法与EggJS基本一致

在模块test-todo中,有一个数据表testTodo,我们仍然在后端路由test/echo对应的控制器方法中进行testTodo增删改查等操作

async echo() {
  // insert
  const res = await this.ctx.db.insert('testTodo', {
    iid: this.ctx.instance.id,
    deleted: 0,
    atomId: 0,
    description: 'test',
  });
  const id = res.insertId;
  // update
  await this.ctx.db.update('testTodo', {
    id,
    description: 'test2',
  });
  // get
  const item = await this.ctx.db.get('testTodo', {
    id,
  });
  // delete
  await this.ctx.db.delete('testTodo', {
    id,
  });
  // response
  this.ctx.success(`${item.id}:${item.description}`);
}

model对象

model对象对ctx.db进行了进一步封装,可以便利的支持多实例软删除

  1. 多实例:自动将ctx.instance.id注入到ctx.db相关方法的参数中
  2. 软删除:自动将modeldelete方法修改为update方法,并将数据表的deleted字段从0修改为1

定义model对象

src/module/test-todo/backend/src/model/todo.js

module.exports = app => {
  class Todo extends app.meta.Model {
    constructor(ctx) {
      super(ctx, { table: 'testTodo', options: { disableDeleted: false } });
    }
  }
  return Todo;
};
名称 默认值 说明
table model对象对应的数据表名,也可以是视图名
disableDeleted false 是否禁用软删除特性

引用model对象

前面提到过,为了支持业务模块的编译特性,所有对象都需要显式require,model对象也不例外

src/module/test-todo/backend/src/models.js

const todo = require('./model/todo.js');

module.exports = app => {
  const models = {
    todo,
  };
  return models;
};

使用model对象

我们看看使用model对象如何实现同样的增删改查等操作

async echo() {
  // insert
  const res = await this.ctx.model.todo.insert({
    atomId: 0,
    description: 'test',
  });
  const id = res.insertId;
  // update
  await this.ctx.model.todo.update({
    id,
    description: 'test2',
  });
  // get
  const item = await this.ctx.model.todo.get({
    id,
  });
  // delete
  await this.ctx.model.todo.delete({
    id,
  });
  // response
  this.ctx.success(`${item.id}:${item.description}`);
}


评论: