关于 egg-mysql 使用中的几个小问题

453 阅读2分钟

使用egg开发过程中遇到的问题

通常使用egg-mysql的时候,官方介绍的方法只有几个简单的增删改查。

对于一些特殊的操作,比如时间范围查询、插入多条操作、更新多条、模糊查询等,都是没有特定方法支持的。如果必须使用,可以使用 ORM 框架如Sequelize,或者使用直接执行 sql 语句,但是这种方式是不推荐的。

排除以上两种的简便的方案

最好的方式还是使用 ORM 框架更加安全省事,今天说一下只使用 egg-mysql 的时候,如何进行上述的操作,注意到egg-mysql的底层使用的是ali-rds,直接初始化了一个rds(config)所以直接调用 rds 上的方法完全是可用的,只是 egg-mysql 的文档没有说明

// egg-mysql部分源码
const rds = require('ali-rds');

function createOneClient(config, app) {
  ...
  const client = rds(config);
  ...
  return client;
}

上述的一些问题的具体实现

具体可以查看ali-rds的使用文档,这里列举常见的一些操作实现;

插入多条数据

// 向数据库插入两条数据
async test() {
  const mysql = this.app.mysql;
  const result = await mysql.insert('test', [
    { name: 'row1', createdAt: mysql.literals.now },
    { name: 'row2', createdAt: mysql.literals.now },
  ]);
  this.success(result);
}

更新多条数据

// 更新数据库的数据
async test() {
  const mysql = this.app.mysql;
  const result = await mysql.updateRows('test', [{ id: 1, name: 'row3' }, { id: 2, name: 'row4' }]);
  this.success(result);
}

分页查询获取总数

// 分页查询获取总数
async test() {
  const mysql = this.app.mysql;
  const result = await mysql.count('test', {});
  this.success(result);
}

时间查询、模糊查询,只能使用直接执行 sql 的方式

async test() {
  // 时间查询
  const mysql = this.app.mysql;
  const result = await mysql.query('SELECT * from test where createdAt >= ?', ['2022-11-15 23:32:34']);
  this.success(result);
}
async test() {
  // 模糊查询
  const mysql = this.app.mysql;
  const name = 'row';
  const result = await mysql.query('SELECT * from test where name like ?', ['%' + name + '%']);
  this.success(result);
}

更详细可以查看ali-rds的具体实现,也可以自己基于 mysql 封装一套自己的 utils。

当然 sequelize 暂时挺香,这里只是解决自己当时只使用 egg-mysql 的时候的一些疑惑。

以上只是个人见解,请指教,个人blog