由于内联mysql查询,我们面临代码质量问题。具有自编写的MySQL查询确实杂波的代码,同时也增加了代码库等何处存储执行的SQL命令
我们的代码是堆满了东西一样
/* 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这样的库,但这并没有真正的帮助,因为我们的查询是复杂的,你可以看到。这主要是为了让我们的查询进入“查询中心”。
我可以知道为什么你不能去ES6,因为我发现它不会影响你现有的代码?你只需要使用一个转译器。 –
目前的依赖关系太多了,至少这就是我所说的:S我也尝试去使用节点6.5,但应用程序在启动时崩溃。目前我尝试将SQL命令放到中央。如果node6.x是一个可能的问题解决者,我将不得不提出它并让它运行。 – m4mbax
你可以考虑在数据库中引入视图来简化一些'SELECT'查询(比如你的例子)。并且可能还有存储过程来简化以某种方式更新数据的查询。当然,这种方法有优点和缺点 - 视图/存储过程必须维护,有时会存在增加隐含的风险(例如,包含其他视图的视图 - 可能需要深入钻研才能找出实际的表格是)。但它可能很有用,例如当一次又一次使用相同连接或'WHERE'条件时。 –