由于内联mysql查询,我们面临代码质量问题。使用自写的mysql查询确实会使代码混乱,并且还会增加代码库等。
我们的代码杂乱无章
/* beautify ignore:start */
/* jshint ignore:start */
var sql = "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;";
/* jshint ignore:end */
/* beautify ignore:end */
我不得不模糊一些代码。
如您所见,在您的代码中重复地执行此操作是不可读的。同样由于atm,我们无法使用ES6,这要归功于多行字符串,这至少会使字符串更漂亮。
现在的问题是,是否有一种方法可以将SQL过程存储在一个地方?作为附加信息,我们使用节点(〜0.12)并表示要公开API,并访问MySQL数据库。
我已经考虑过,使用JSON将导致更大的混乱。另外,这甚至是不可能的,因为JSON的字符集有点严格,并且JSON可能也不会喜欢具有多行字符串。
然后,我想到了将SQL存储在文件中并在启动节点应用程序时加载的想法。目前,这是将SQL查询放在一个位置并将其提供给其余节点模块的最佳方法。这里的问题是,使用一个文件?每个查询使用一个文件?每个数据库表使用一个文件?
非常感谢您的帮助,我不能成为第一个解决此问题的人,所以也许有人有一个有效的解决方案!
PS:我尝试使用像squel这样的库,但这并没有真正的帮助,因为您可以看到我们的查询很复杂。它主要是关于将我们的查询放入“查询中心”。
我更喜欢将每个更大的查询都放在一个文件中。这样,您可以突出显示语法,并且很容易在服务器启动时加载。为了构建这种结构,我通常对所有查询都有一个文件夹,而对于每个模型都具有一个文件夹。
# queries/mymodel/select.mymodel.sql
SELECT * FROM mymodel;
// in mymodel.js
const fs = require('fs');
const queries = {
select: fs.readFileSync(__dirname + '/queries/mymodel/select.mymodel.sql', 'utf8')
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句