使用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。