登录
首页 >  数据库 >  MySQL

Egg上层框架CabloyJS是如何输出SQL语句日志的?

来源:SegmentFault

时间:2023-02-21 14:56:11 218浏览 收藏

怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Egg上层框架CabloyJS是如何输出SQL语句日志的?》,涉及到MySQL、eggjs,有需要的可以收藏一下

背景

在Egg开发实践中,经常会遇到一个问题:

  // mysql
  config.mysql = {
    clients: {
      __ebdb: {
        // debug: true,
        hook: {
          meta: {
            color: 'orange',
            long_query_time: 0,
          },
          callback: {
            onQuery,
          },
        },
      },
    },
  };
名称 说明
debug 如果为true,就是启用内置的调试标志。在这里没有启用
hook.meta 包含hook的配置参数
hook.meta.color 日志输出的颜色
hook.meta.long_query_time 如果SQL语句的执行时间超过了
function RDSClient(options) {
  if (!(this instanceof RDSClient)) {
    return new RDSClient(options);
  }
  Operator.call(this);

  this.pool = mysql.createPool(options);

  const _hook = options.hook;
  const _getConnection = this.pool.getConnection.bind(this.pool);
  this.pool.getConnection = function(cb) {
    _getConnection(function(err, conn) {
      if (err) return cb(err, null);
      onQuery(conn, function(err) {
        if (err) return cb(err, null);
        onConnection(conn, function(err) {
          if (err) return cb(err, null);
          cb(null, conn);
        });
      });
    });
    function onConnection(conn, cb) {
      if (!_hook || !_hook.callback || !_hook.callback.onConnection) return cb(null);
      if (conn.__hook_onConnection) return cb(null);
      conn.__hook_onConnection = true;
      co.wrap(_hook.callback.onConnection)(new RDSConnection(conn)).then(function() {
        cb(null);
      }).catch(function(err) {
        cb(err);
      });
    }
    function onQuery(conn, cb) {
      if (!_hook || !_hook.callback || !_hook.callback.onQuery) return cb(null);
      if (conn.__hook_onQuery) return cb(null);
      conn.__hook_onQuery = true;
      const _query = conn.query;
      conn.query = function query(sql, values, cb) {
        const prevTime = Number(new Date());
        const sequence = _query.call(conn, sql, values, cb);
        const _callback = sequence._callback;
        sequence._callback = function(...args) {
          const ms = Number(new Date()) - prevTime;
          _hook.callback.onQuery(_hook, ms, sequence, args);
          _callback && _callback(...args);
        };
        return sequence;
      };
      cb(null);
    }
  };

  [
    'query',
    'getConnection',
  ].forEach(method => {
    this.pool[method] = promisify(this.pool[method]);
  });
}
  1. 首先,拦截
    function onQuery(hook, ms, sequence, args) {
      if (!hook.meta.long_query_time || hook.meta.long_query_time  ${sequence.sql}`;
        console.log(chalk.keyword(hook.meta.color)(message));
      }
    }
    1. 首先判断
      const moduleAlias = require('module-alias');
      moduleAlias.addAlias('ali-rds', '@zhennann/ali-rds');

      结语

      这样,我们就实现了一个轻巧的方案,不仅可以直接在Egg上层框架中提供缺省的SQL语句输出方案,而且还可以通过覆盖config参数

      hook.callback.onQuery
      提供自定义的输出方案

      理论要掌握,实操不能落!以上关于《Egg上层框架CabloyJS是如何输出SQL语句日志的?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表