egg-xc-base
Version:
a base framework with egg.js
139 lines (138 loc) • 3.84 kB
JavaScript
;
const BaseController = require('./base-controller');
/**
*数据库Controller基类
*/
class DbController extends BaseController {
// 获取helper里的数据库对象
get db() {
return this.helper.db;
}
// 为直接使用mysql模块的escape
get mql() {
return require('mysql');
}
/**
* 直接用db1执行sql
* @param {string} _sql sql语句
* @return {Promise} Promise
*/
async doQuery(_sql) {
return await this.db.doQuery(_sql, this);
}
/**
* 分页查询
* @param {object} info
* @param {string} info.sql sql语句
* @param {number} info.page_num 页码默认1
* @param {number} info.page_size 一页多少条默认10
*/
async doPage(info){
this.ctx.validate({
_sql : {type:'string'}
},info)
let list = []
let count = 0
let page_num = info.page_num || 1
let page_size = info.page_size || 10
let that = this
await Promise.all([
async function(){
list = await that.doQuery(`${info._sql} limit ${ that.to((page_num-1)*page_size ) } , ${that.to(page_size)}`)
}(),
async function(){
let c = await that.doQuery(
`select count(*) as c from ( ${info._sql}) c`
)
if(c.length>0){
count =c[0].c
}
}()
])
return {
list,
count
}
}
/**
* 直接用db1执行sql 抛出错误
* @param {string} _sql sql语句
* @return {Promise} Promise
*/
async doQueryError(_sql) {
return await this.db.doQueryError(_sql, this);
}
/**
* 在tran执行事务的时候使用可以传递统一的conn数据库连接
* @param {object} conn 数据库连接
* @param {string} _sql sql语句
* @return {Promise} Promise
*/
async doQueryConn(conn, _sql) {
return await this.db.doQueryConn(_sql, conn, this);
}
/**
* 在tran执行事务的时候使用可以传递统一的conn数据库连接 抛出错误
* @param {object} conn 数据库连接
* @param {string} _sql sql语句
* @return {Promise} Promise
*/
async doQueryConnError(conn, _sql) {
return await this.db.doQueryConnError(_sql, conn, this);
}
/**
* 执行事务
* @param {asyncFunction} asyncFunction 事务执行 async回调方法
* @return {Promise} Promise
*/
async tran(asyncFunction) {
return await this.db.tran(this, asyncFunction);
}
/**
* 执行事务 抛出Error
* @param {asyncFunction} asyncFunction 事务执行 async回调方法
* @return {Promise} Promise
*/
async tranError(asyncFunction) {
return await this.db.tranError(this, asyncFunction);
}
/**
* 执行多数据源sql
* @param {string} dbId 数据源id
* @param {string} _sql sql语句
* @return {Promise} Promise
*/
async doMQuery(dbId, _sql) {
const conn = this.app.mysql.get(dbId);
return await this.db.doQueryConn(_sql, conn, this);
}
/**
* 执行多数据源事务
* @param {string} dbId 数据源id
* @param {string} asyncFunction 事务执行 async回调方法
* @return {Promise} Promise
*/
async tranM(dbId, asyncFunction) {
const conn = this.app.mysql.get(dbId);
return this.db.tranConn(this, conn, asyncFunction);
}
/**
* 执行多数据源事务 抛出错误
* @param {string} dbId 数据源id
* @param {string} asyncFunction 事务执行 async回调方法
* @return {Promise} Promise
*/
async tranMError(dbId, asyncFunction) {
const conn = this.app.mysql.get(dbId);
return this.db.tranConnError(this, conn, asyncFunction);
}
/**
* 防sql注入处理
* @param {object} params sql中需要处理的字段
* @return {object} object
*/
to(params) {
return this.mql.escape(params);
}
}
module.exports = DbController;