由於內聯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'條件時。 –