Where to store SQL commands for execution

后端 未结 12 1462
后悔当初
后悔当初 2021-02-05 16:00

We face code quality issues because of inline mysql queries. Having self-written mysql queries really clutters the code and also increases code base etc.

Our code is clu

12条回答
  •  后悔当初
    2021-02-05 16:43

    There are a few things you want to do. First, you want to store multi-line without ES6. You can take advantage of toString of a function.

    var getComment = function(fx) {
            var str = fx.toString();
            return str.substring(str.indexOf('/*') + 2, str.indexOf('*/'));
          },
          queryA = function() {
            /* 
                select blah
                  from tableA
                 where whatever = condition
            */
          }
    
        console.log(getComment(queryA));

    You can now create a module and store lots of these functions. For example:

    //Name it something like salesQry.js under the root directory of your node project.
    var getComment = function(fx) {
        var str = fx.toString();
        return str.substring(str.indexOf('/*') + 2, str.indexOf('*/'));
      },
      query = {};
    
    query.template = getComment(function() { /*Put query here*/ });
    query.b = getComment(function() {
      /*
      SELECT *
       ,DATE_ADD(sc.created_at,INTERVAL 14 DAY) AS duedate
       ,distance_mail(?,?,lat,lon) as distance,count(pks.skill_id) c1
       ,count(ps.profile_id) c2
        FROM TABLE sc
        JOIN  PACKAGE_V psc on sc.id = psc.s_id 
        JOIN  PACKAGE_SKILL pks on pks.package_id = psc.package_id  
        LEFT JOIN PROFILE_SKILL ps on ps.skill_id = pks.skill_id AND ps.profile_id = ?
       WHERE sc.type in ('a','b','c','d','e','f','g','h')
         AND sc.status = 'open'
         AND sc.crowd_type = ?
         AND sc.created_at < DATE_SUB(NOW(),INTERVAL 10 MINUTE) 
         AND sc.created_at > DATE_SUB(NOW(),INTERVAL 14 DAY)
         AND distance_mail(?, ?,lat,lon) < 500
       GROUP BY sc.id
      HAVING c1 = c2 
      ORDER BY distance;
      */
    });
    
    //Debug
    console.log(query.template);
    console.log(query.b);
    
    //module.exports.query = query //Uncomment this.

    You can require the necessary packages and build your logic right in this module or build a generic wrapper module for better OO design.

    //Name it something like SQL.js. in the root directory of your node project.
    var mysql = require('mysql'),
      connection = mysql.createConnection({
        host: 'localhost',
        user: 'me',
        password: 'secret',
        database: 'my_db'
      });
    
    module.exports.load = function(moduleName) {
      var SQL = require(moduleName);
      return {
        query: function(statement, param, callback) {
          connection.connect();
          connection.query(SQL[statement], param, function(err, results) {
            connection.end();
            callback(err, result);
          });
        }
      });
    

    To use it, you do something like:

    var Sql = require ('./SQL.js').load('./SalesQry.js');
    
    Sql.query('b', param, function (err, results) {
      ...
      });
    

提交回复
热议问题