UNPKG

fa-comm

Version:
854 lines (828 loc) 33 kB
const verify = require('../comm/verify'); const guid = require('../comm/guid'); const mysqld = require('mysql'); const _convert = require('../comm/convert'); /** * Mysql操作类 */ let MySQL = class { /** * Mysql对象构造函数 * @param {JSON} options 连接配置对象 */ constructor(options) { options.host = options.host || (options.uri || (options.url || "127.0.0.1")); options.port = options.port || 3306; options.user = options.user || (options.username || (options.loginid || "root")); options.password = options.password || (options.pwd || (options.pass || "root")); options.database = options.database || (options.db || "mysql"); options.multipleStatements = options.multipleStatements != void 0 ? options.multipleStatements : true; options.insecureAuth = options.insecureAuth != void 0 ? options.insecureAuth : true; options.connectionLimit = options.connectionLimit || 10; options.charset = options.charset || "utf8mb4"; options.timeout = options.timeout || 10000; options.acquireTimeout = options.timeout; options.connectTimeout = options.timeout; this._name = guid.v22; this._options = options; this._pool = mysqld.createPool(this._options); this.formatSQL = formatSQL; this.query = _queryByPool; this.list = _queryListByPool; this.getTable = _getTable; this.getConnection = _getConnection; this.getLongConnection = _getLongConnection; // console.info(`create mysql client mysql://${options.host}/${options.database}?user=${options.user}&password=${options.password}&port=${options.port} success`.toInfo()); }; }; /** * mysql连接对象,可用于事物的处理。 * 如果声明连接后,未开启事物,在执行完一次查询后,自动释放连接。 * 如果声明连接后,已开启事物,则在commit或rollback后,自动释放。 */ class MysqlConnection { /** * 数据库连接对象构造函数 * @param {*} conn * @memberof MysqlConnection */ constructor(conn, id, long) { this._long = long || false; this._name = guid.v22; this._id = id || 0; this._isrelease = false; this._transaction = false; this._conn = conn; this.query = _queryByConn; this.beginTransaction = _beginTransaction; this.commit = _commit; this.rollback = _rollback; this.release = _release; }; }; /** * 格式化SQL语句 * @param {String} sql 需要格式化的sql * @param {JSON} options 格式化的数据源 * @returns */ function formatSQL(sql, options) { for (var k in options) { // if (typeof options[k] != 'function') { var reg = new RegExp("@" + k + "@", "g"); //字符串最后一位是$需要再添加一个$去转义 if (typeof options[k] == 'string') { if (options[k].substr(options[k].length - 1, 1) == '$') { options[k] += '$'; } sql = sql.replace(reg, mysqld.escape(options[k])); } else if (options[k] instanceof Date) { sql = sql.replace(reg, mysqld.escape(options[k].format('yyyy-MM-dd hh:mm:ss'))); } else if (verify.isJsonOrJsonArray(options[k])) { sql = sql.replace(reg, `'${JSON.stringify(options[k])}'`); } else if (options[k] instanceof Array) { sql = sql.replace(reg, `'${options[k].join("','")}'`); } else if (typeof options[k] === 'number') { sql = sql.replace(reg, `'${options[k].toString()}'`); } else if (options[k] === null) { sql = sql.replace(reg, `NULL`); } // } } return sql; } /** * 执行一条sql语句 * @param {String} sql 需要执行的sql * @param {JSON} data 数据源 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns 执行结果 */ function _queryByConn(sql, data, showstdout) { showstdout = showstdout != undefined ? showstdout : true; let self = this; sql = formatSQL(sql, data); return new Promise(function (resolve, reject) { if (self._isrelease) { let err = `${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) is released`; showstdout && console.warn(err.toWarn()); reject(new Error(err)); } else { self._conn.query(sql, function (err, result) { if (err) { showstdout && console.warn(`${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) query sql failed:${err}`.toError()); reject(err); } else { showstdout && console.info(`${self._long ? 'long' : 'short'} connetcion:${self._id}(${self._name}) query sql:${sql} success,result:${verify.isJsonArray(result) || verify.isJson(result) ? JSON.stringify(result) : result.toString()}`.toInfo()); if (!self._transaction && !self._long) { self.release(); } resolve(result); } }); } }); } /** * 开启事物 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns */ function _beginTransaction(showstdout) { showstdout = showstdout != undefined ? showstdout : true; let self = this; return new Promise(function (resolve, reject) { if (self._isrelease) { let err = `${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) is released`; showstdout && console.warn(err.toWarn()); reject(new Error(err)); } else { self._conn.beginTransaction(function (err, res) { if (err) { showstdout && console.warn(`${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) beginTransaction error:${err}`.toWarn()); reject(err); } else { showstdout && console.info(`${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) beginTransaction success`.toInfo()); self._transaction = true; resolve(); } }); } }); } /** * 提交事物 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns */ function _commit(showstdout) { showstdout = showstdout != undefined ? showstdout : true; let self = this; return new Promise(function (resolve, reject) { if (self._isrelease) { let err = `${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) is released`; showstdout && console.warn(err.toWarn()); reject(new Error(err)); } else if (self._transaction) { self._conn.commit(function (err, res) { if (err) { showstdout && console.warn(`${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) commit transaction error:${err}`.toWarn()); reject(err); } else { showstdout && console.warn(`${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) commit transaction success`.toInfo()); if (!self._long) { self.release(); } resolve(); } }); } else { let err = `${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) is not begin transaction`; showstdout && console.warn(err.toWarn()); reject(new Error(err)); } }); } /** * 回滚事物 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns */ function _rollback(showstdout) { showstdout = showstdout != undefined ? showstdout : true; let self = this; return new Promise(function (resolve, reject) { if (self._isrelease) { let err = `${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) is released`; showstdout && console.warn(err.toWarn()); reject(new Error(err)); } else if (self._transaction) { self._conn.rollback(function (err, res) { if (err) { showstdout && console.warn(`${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) rollback transaction error:${err}`.toWarn()); reject(err); } else { showstdout && console.info(`${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) rollback transaction success`.toInfo()); if (!self._long) { self.release(); } resolve(); } }); } else { let err = `${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) is not begin transaction`; showstdout && console.warn(err.toWarn()); reject(new Error(err)); } }); } /** * 释放连接 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns */ function _release(showstdout) { showstdout = showstdout != undefined ? showstdout : true; let self = this; return new Promise(function (resolve, reject) { if (self._isrelease) { let err = `${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) is released`; showstdout && console.warn(err.toWarn()); reject(new Error(err)); } else { self._conn.release(); self._isrelease = true; self._transaction = false; showstdout && console.info(`${self._long ? 'long' : 'short'} connection:${self._id}(${self._name}) release success`.toInfo()); resolve(); } }); } /** * 获取一个短连接,在未开启事物的情况下,执行完query会自动释放; * 在开启事物的情况下,执行commit或roolback后会自动释放 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns */ function _getConnection(showstdout) { showstdout = showstdout != undefined ? showstdout : true; // MySQL.prototype.getConnection = function () { var self = this; return new Promise(function (resolve, reject) { try { if (self._pool._allConnections.length >= self._options.connectionLimit) { showstdout && console.warn(`get connection failed:Exceeding the maximum limit of 10`.toWarn()); resolve(null); } else { self._pool.getConnection(function (err, connection) { if (err) { showstdout && console.error(`get connection error:${err}`.toError()); // resolve(null); reject(err); } else { let _MysqlConnection = new MysqlConnection(connection, self._pool._allConnections.length); showstdout && console.info(`get ${self._long ? 'long' : 'short'} connection:${_MysqlConnection._id}(${_MysqlConnection._name}) success`.toInfo()); resolve(_MysqlConnection); } }); } } catch (e) { showstdout && console.error(`get connection error:${err}`.toError()); // resolve(null); reject(e); } }); }; /** * 获取一个长连接,无论何种情况下,都不会自动释放连接,需要手动调用release释放 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns */ function _getLongConnection(showstdout) { showstdout = showstdout != undefined ? showstdout : true; // MySQL.prototype.getLongConnection = function () { var self = this; return new Promise(function (resolve, reject) { try { if (self._pool._allConnections.length >= self._options.connectionLimit) { showstdout && console.warn(`get connection failed:Exceeding the maximum limit of 10`.toWarn()); resolve(null); } else { self._pool.getConnection(function (err, connection) { if (err) { showstdout && console.error(`get connection error:${err}`.toError()); reject(err); } else { let _MysqlConnection = new MysqlConnection(connection, self._pool._allConnections.length, true); showstdout && console.info(`get ${_MysqlConnection._long ? 'long' : 'short'} connection:${_MysqlConnection._id}(${_MysqlConnection._name}) success`.toInfo()); resolve(_MysqlConnection); } }); } } catch (e) { showstdout && console.error(`get ${self._long ? 'long' : 'short'} connection error:${err}`.toError()); // resolve(null); reject(e); } }); }; /** * 执行一条SQL语句,并自动释放连接,无需手动release * @param {String} sql 需要自行的sql语句 * @param {JSON} data 数据源 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns */ function _queryByPool(sql, data, showstdout) { // MySQL.prototype.query = function (sql, data) { showstdout = showstdout != undefined ? showstdout : true; var self = this; sql = formatSQL(sql, data); return new Promise(function (resolve, reject) { try { self._pool.query(sql, function (err, result) { if (err) { showstdout && console.warn(`connection pool query sql:${sql} failed:${err}`.toWarn()); reject(err); } else { let _result = ''; try { _result = JSON.stringify(result); } catch (e) { _result = result.toString(); } _result = 'connection pool query sql:' + sql + ' success,result:' + _result; showstdout && console.info(_result.toInfo()); resolve(result); } }); } catch (e) { showstdout && console.error(`connection pool query sql error:${sql} ${err}`.toError()); // resolve(null); reject(e); } }); }; /** * 执行一条分页查询语句,并自动释放连接,无需手动release * @param {String} sql 需要自行的sql语句 * @param {JSON} data 数据源 * @param {JSON} page 分页信息 * @param {String/JSON/Array<JSON>} order 排序 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns */ function _queryListByPool(sql, data, page, order, showstdout) { showstdout = showstdout != undefined ? showstdout : true; sql = sql || ""; data = data || {}; page = page || {}; // order = order || ""; if (verify.isJson(order)) { if (order.column) { order = ` ORDER BY ${order.column} ${order.type || " ASC "} `; } else { order = ""; } } else if (verify.isJsonArray(order)) { let _order = []; for (const o of order) { if (o.column) { _order.push(` ${o.column} ${o.type || " ASC "} `); } } if (_order.length) { order = ` ORDER BY ${_order.join(',')} `; } } else { order = _convert.toString(order); } var self = this; sql = formatSQL(sql, data); return new Promise(function (resolve, reject) { try { //limit (pageindex - 1) * pagesize,pagesize const p1 = ((page.index || 1) - 1) * (page.size || 10); const p2 = page.size || 10; const sql1 = `${sql} ${order} limit ${p1},${p2};`; const sql2 = `SELECT COUNT(1) count FROM (${sql}) tb;`; Promise.all([self.query(sql1), self.query(sql2)]).then(function (result) { resolve({ list: result[0], count: result[1][0].count }); }).catch(function (err) { reject(err); }); } catch (e) { showstdout && console.error(`connection pool query sql error:${sql} ${err}`.toError()); // resolve(null); reject(e); } }); }; /** * 获取表对象 * @param {String} table_name 表名称 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns 表空间对象 */ function _getTable(table_name, showstdout) { // MySQL.prototype.getTable = function (table_name) { showstdout = showstdout != undefined ? showstdout : true; var self = this; return new Promise(function (resolve, reject) { self._pool.query(`\ select * from information_schema.columns \ where table_schema = '${self._options.database}' \ and table_name = '${table_name}'`, function (err, result) { if (err) { showstdout && console.warn(`get table ${table_name} failed:${err}`.toWarn()); reject(err); } else { if (result && result.length) { showstdout && console.info(`get table ${table_name} success`.toInfo()); resolve({ 'name': table_name, 'schema': result, 'insert': _insert, 'update': _update, 'delete': _delete, 'select': _select, 'getInsertSql': _getInsertSql, 'getUpdateSql': _getUpdateSql, 'getDeleteSql': _getDeleteSql, 'getSelectSql': _getSelectSql, 'root': self }); } else { showstdout && console.warn(`get table ${table_name} failed,table is not exists`.toWarn()); resolve(null); } } }); }); } /** * 寻找唯一主键 * @param {*} schema 表结构 * @returns */ function findPRI(schema) { for (let i = 0; i < schema.length; i++) { if (schema[i].COLUMN_KEY == "PRI") { return schema[i]; } } return undefined; } function findPRI_v2(schema) { let pri = []; for (let i = 0; i < schema.length; i++) { if (schema[i].COLUMN_KEY == "PRI") { pri.push(schema[i]); } } return pri; } /** * 获取结构对象 * @param {*} schema 表结构 * @returns */ function getStucture(schema) { let stucture = {}; for (let i = 0; i < schema.length; i++) { if (schema[i].COLUMN_KEY != "PRI" || (schema[i].COLUMN_KEY == "PRI" && schema[i].EXTRA != "auto_increment")) { if (schema[i].COLUMN_KEY == "PRI") { stucture[schema[i].COLUMN_NAME] = guid.v22; } else { stucture[schema[i].COLUMN_NAME] = null; } } } return stucture; } /** * 获取标准结构数据 * @param {*} schema 表结构 * @param {*} data 数据源 * @returns */ function getStuctureData(schema, data) { let _data = {}; for (let i = 0; i < schema.length; i++) { if (schema[i].COLUMN_KEY == "PRI") { if (schema[i].EXTRA == "auto_increment") { _data[schema[i].COLUMN_NAME] = 0; } else { _data[schema[i].COLUMN_NAME] = data[schema[i].COLUMN_NAME] || guid.v22; } } if (schema[i].COLUMN_DEFAULT) { if (schema[i].COLUMN_DEFAULT != 'CURRENT_TIMESTAMP') { _data[schema[i].COLUMN_NAME] = schema[i].COLUMN_DEFAULT; } else { _data[schema[i].COLUMN_NAME] = new Date().format('yyyy-MM-dd hh:mm:ss'); } } const tmp = guid.v34; _data[schema[i].COLUMN_NAME] = data[schema[i].COLUMN_NAME] != void 0 ? (verify.isString(data[schema[i].COLUMN_NAME]) ? data[schema[i].COLUMN_NAME] : JSON.stringify(data[schema[i].COLUMN_NAME])) : (_data[schema[i].COLUMN_NAME] || tmp); if (_data[schema[i].COLUMN_NAME] == tmp) { delete _data[schema[i].COLUMN_NAME]; } } return _data; } /** * 表格是否包含字段 * @param {*} schema * @param {*} column * @returns */ function _existsColumnByTable(schema, column) { for (const row of schema) { if (row.COLUMN_NAME == column) { return true; } } return false; } /** * 新增一行数据 * @param {JSON} data 需要新增的数据源 * @param {Boolean} showstdout 是否显示输出 默认 true */ function _insert(data, showstdout) { showstdout = showstdout != undefined ? showstdout : true; let self = this; return new Promise(function (resolve, reject) { let pri = findPRI_v2(self.schema); let _data = getStuctureData(self.schema, data); let columns = new Array(); let values = new Array(); let sql = `INSERT INTO \`${self.name}\` (`; for (let key in _data) { let _pri = pri.find(item => item.COLUMN_NAME == key); if (_pri) { if (_pri.EXTRA != 'auto_increment') { columns.push(`\`${key}\``); values.push(`${key}`); } } else { if (_existsColumnByTable(self.schema, key)) { columns.push(`\`${key}\``); values.push(`${key}`); } } } sql += columns.join(","); sql += `) VALUES (@${values.join("@,@")}@);`; sql = formatSQL(sql, _data); try { self.root._pool.query(sql, function (err, result) { if (err) { showstdout && console.warn(`connection pool query [insert] sql:${sql} failed:${err}`.toWarn()); reject(err); } else { // result.insertId = result.insertId || _data[pri.COLUMN_NAME]; if (!result.insertId) { if (pri.length == 1) { result.insertId = _data[pri[0].COLUMN_NAME]; } else { result.insertId = {}; for (const _pri of pri) { result.insertId[_pri.COLUMN_NAME] = _data[_pri.COLUMN_NAME]; } } } showstdout && console.info(`connection pool query [insert] sql:${sql} success,result:${verify.isJsonArray(result) || verify.isJson(result) ? JSON.stringify(result) : result.toString()}`.toInfo()); resolve(result); } }); } catch (e) { showstdout && console.error(`connection pool query [insert] sql error:${sql} ${err}`.toError()); reject(e); } }); } /** * 格式化新增语句 * @param {JSON} data * @returns */ function _getInsertSql(data) { let self = this; let pri = findPRI_v2(self.schema); let _data = getStuctureData(self.schema, data); let columns = new Array(); let values = new Array(); let sql = `INSERT INTO \`${self.name}\` (`; for (let key in _data) { let _pri = pri.find(item => item.COLUMN_NAME == key); if (_pri) { if (_pri.EXTRA != 'auto_increment') { columns.push(`\`${key}\``); values.push(`${key}`); } } else { if (_existsColumnByTable(self.schema, key)) { columns.push(`\`${key}\``); values.push(`${key}`); } } } sql += columns.join(","); sql += `) VALUES (@${values.join("@,@")}@);`; sql = formatSQL(sql, _data); return sql; } /** * 根据主键修改一行数据 * @param {JSON} data 需要修改的数据 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns */ function _update(data, showstdout) { showstdout = showstdout != undefined ? showstdout : true; let self = this; return new Promise(function (resolve, reject) { let pri = findPRI_v2(self.schema); let sql = `UPDATE \`${self.name}\` SET`; let where = [], update = new Array(); for (let key in data) { let _pri = pri.find(item => item.COLUMN_NAME == key); if (_pri) { where.push(`${_pri.COLUMN_NAME} = @${_pri.COLUMN_NAME}@`); } else { if (_existsColumnByTable(self.schema, key)) { update.push(`\`${key}\` = @${key}@`); } } } sql = `${sql} ${update.join(',')} WHERE ${where.join(' AND ')};`; sql = formatSQL(sql, data); try { self.root._pool.query(sql, function (err, result) { if (err) { showstdout && console.warn(`connection pool query [update] sql:${sql} failed:${err}`.toWarn()); reject(err); } else { showstdout && console.info(`connection pool query [update] sql:${sql} success,result:${JSON.stringify(result)}`.toInfo()); resolve(result); } }); } catch (e) { showstdout && console.error(`connection pool query [update] sql error:${sql} ${err}`.toError()); reject(e); } }); } /** * 根据主键格式化修改语句 * @param {JSON} data 需要修改的数据 * @returns */ function _getUpdateSql(data) { let self = this; let pri = findPRI_v2(self.schema); let sql = `UPDATE \`${self.name}\` SET`; let where = [], update = new Array(); for (let key in data) { let _pri = pri.find(item => item.COLUMN_NAME == key); if (_pri) { where.push(`${_pri.COLUMN_NAME} = @${_pri.COLUMN_NAME}@`); } else { if (_existsColumnByTable(self.schema, key)) { update.push(`\`${key}\` = @${key}@`); } } } sql = `${sql} ${update.join(',')} WHERE ${where.join(' AND ')};`; sql = formatSQL(sql, data); return sql; } /** * 根据主键删除记录 * @param {JSON} data 要删除的对象 * @param {Boolean} showstdout 是否显示输出 默认 true */ function _delete(data, showstdout) { showstdout = showstdout != undefined ? showstdout : true; let self = this; return new Promise(function (resolve, reject) { let pri = findPRI_v2(self.schema); // let sql = `DELETE FROM \`${self.name}\` WHERE \`${pri.COLUMN_NAME}\` = @${pri.COLUMN_NAME}@;`; let sql = `DELETE FROM \`${self.name}\` WHERE `; let where = []; for (const _pri of pri) { where.push(`\`${_pri.COLUMN_NAME}\` = @${_pri.COLUMN_NAME}@`); } sql += where.join(' AND '); sql = formatSQL(sql, data); try { self.root._pool.query(sql, function (err, result) { if (err) { showstdout && console.warn(`connection pool query [delete] sql:${sql} failed:${err}`.toWarn()); reject(err); } else { showstdout && console.info(`connection pool query [delete] sql:${sql} success,result:${JSON.stringify(result)}`.toInfo()); resolve(result); } }); } catch (e) { showstdout && console.error(`connection pool query [delete] sql error:${sql} ${err}`.toError()); reject(e); } }); } /** * 根据主键格式化删除语句 * @param {JSON} data 要删除的对象 */ function _getDeleteSql(data) { let self = this; let pri = findPRI_v2(self.schema); let sql = `DELETE FROM \`${self.name}\` WHERE `; let where = []; for (const _pri of pri) { where.push(`\`${_pri.COLUMN_NAME}\` = @${_pri.COLUMN_NAME}@`); } sql += where.join(' AND '); sql = formatSQL(sql, data); return sql; } /** * 根据主键查询记录 * @param {JSON} data 包含组件数据的对象 * @param {Boolean} convert_date 是否将时间类型的字段转换成字符串格式 * @param {Boolean} showstdout 是否显示输出 默认 true * @returns */ function _select(data, convert_date, showstdout) { showstdout = showstdout != undefined ? showstdout : true; let self = this; convert_date = convert_date != undefined ? convert_date : true; return new Promise(function (resolve, reject) { let pri = findPRI_v2(self.schema); let columns = new Array(); if (convert_date == false) { columns.push('*'); } else { for (let schema of self.schema) { if (schema.DATA_TYPE.toLowerCase() == "date") { columns.push(`DATE_FORMAT(\`${schema.COLUMN_NAME}\`,'%Y-%m-%d') AS \`${schema.COLUMN_NAME}\``); } else if (schema.DATA_TYPE.toLowerCase() == "datetime") { columns.push(`DATE_FORMAT(\`${schema.COLUMN_NAME}\`,'%Y-%m-%d %H:%i:%s') AS \`${schema.COLUMN_NAME}\``); } else { columns.push(`\`${schema.COLUMN_NAME}\``); } } } let where = []; for (const _pri of pri) { where.push(`\`${_pri.COLUMN_NAME}\` = @${_pri.COLUMN_NAME}@`); } let sql = `SELECT ${columns} FROM \`${self.name}\` WHERE ${where.join(' AND ')};`; sql = formatSQL(sql, data); try { self.root._pool.query(sql, function (err, result) { if (err) { showstdout && console.warn(`connection pool query [select] sql:${sql} failed:${err}`.toWarn()); reject(err); } else { result = result && result.length ? result[0] : undefined; if (result != undefined) { showstdout && console.info(`connection pool query [select] sql:${sql} success,result:${JSON.stringify(result)}`.toInfo()); } else { showstdout && console.info(`connection pool query [select] sql:${sql} success,result:`.toInfo()); } resolve(result); } }); } catch (e) { showstdout && console.error(`connection pool query [select] sql error:${sql} ${err}`.toError()); reject(e); } }); } /** * 根据主键格式化查询语句 * @param {JSON} data 包含组件数据的对象 * @param {Boolean} convert_date 是否将时间类型的字段转换成字符串格 * @returns */ function _getSelectSql(data, convert_date) { let self = this; convert_date = convert_date != undefined ? convert_date : true; let pri = findPRI_v2(self.schema); let columns = new Array(); if (convert_date == false) { columns.push('*'); } else { for (let schema of self.schema) { if (schema.DATA_TYPE.toLowerCase() == "date") { columns.push(`DATE_FORMAT(\`${schema.COLUMN_NAME}\`,'%Y-%m-%d') AS \`${schema.COLUMN_NAME}\``); } else if (schema.DATA_TYPE.toLowerCase() == "datetime") { columns.push(`DATE_FORMAT(\`${schema.COLUMN_NAME}\`,'%Y-%m-%d %H:%i:%s') AS \`${schema.COLUMN_NAME}\``); } else { columns.push(`\`${schema.COLUMN_NAME}\``); } } } let where = []; for (const _pri of pri) { where.push(`\`${_pri.COLUMN_NAME}\` = @${_pri.COLUMN_NAME}@`); } let sql = `SELECT ${columns} FROM \`${self.name}\` WHERE ${where.join(' AND ')};`; sql = formatSQL(sql, data); return sql; } module.exports = MySQL;