【问题标题】:SQL query - rubocop line too longSQL 查询 - rubocop 行太长
【发布时间】:2021-03-10 10:08:12
【问题描述】:

我的 ruby​​ 代码中有一个 SQL 查询,但我的 rubocop 在 WHEN 行中给我一个错误 - layout/linelength line is too long. [128/120]。下面划分查询的正确方法是什么?

  SELECT
    bank_transfers.date AS day,
    CAST(SUM(bank_transfers.amount_cents) AS BIGINT) AS gross_value,
    CAST(SUM(CASE WHEN bank_transfers.amount_cents < 0 THEN bank_transfers.amount_cents END) AS BIGINT) AS expenses_sum,
    CAST(SUM(CASE WHEN bank_transfers.amount_cents > 0 THEN bank_transfers.amount_cents END) AS BIGINT) AS revenues_sum
  FROM bank_transfers
  JOIN customers ON customers.id = bank_transfers.customer_id
  WHERE customers.id = #{customer.id}
  AND bank_transfers.date < '#{Date.current}'
  AND bank_transfers.date >= '#{final_past_date}'
  GROUP BY day

【问题讨论】:

  • 我认为 Rubocop 不会报告错误。它只是给出了遵循某种风格指南或与你的同事讨论代码应该是什么样子的建议。因此,当您认为代码看起来不错并且易于阅读和理解时,我认为忽略(禁用)某些违规行为是完全可以的。

标签: sql ruby postgresql rubocop


【解决方案1】:

您当前的格式是 SQL 美化器所建议的。因此,您的解决方案主要是解决方法。这里有3种方法。我建议你选择你喜欢的那个(我倾向于第一个)。

  1. 如果与 robocop I 不匹配,您可以仅针对此块停用 robocop 行长度:
# rubocop:disable Metrics/LineLength 
...
 SELECT
    bank_transfers.date AS day,
    CAST(SUM(bank_transfers.amount_cents) AS BIGINT) AS gross_value,
    CAST(SUM(CASE WHEN bank_transfers.amount_cents < 0 THEN bank_transfers.amount_cents END) AS BIGINT) AS expenses_sum,
    CAST(SUM(CASE WHEN bank_transfers.amount_cents > 0 THEN bank_transfers.amount_cents END) AS BIGINT) AS revenues_sum
  FROM bank_transfers
  JOIN customers ON customers.id = bank_transfers.customer_id
  WHERE customers.id = #{customer.id}
  AND bank_transfers.date < '#{Date.current}'
  AND bank_transfers.date >= '#{final_past_date}'
  GROUP BY day
...
# rubocop:enable Metrics/LineLength
  1. 将 SQL 查询用作其他内容,例如删除制表符或有更多换行符。 (只是把下面的选项之一)。最大的缺点:可读性较低。
SELECT
bank_transfers.date AS day,
CAST(SUM(bank_transfers.amount_cents) AS BIGINT) AS gross_value,
CAST(SUM(CASE WHEN bank_transfers.amount_cents < 0 THEN bank_transfers.amount_cents END) AS BIGINT) AS expenses_sum,
CAST(SUM(CASE WHEN bank_transfers.amount_cents > 0 THEN bank_transfers.amount_cents END) AS BIGINT) AS revenues_sum
FROM bank_transfers
JOIN customers ON customers.id = bank_transfers.customer_id
WHERE customers.id = #{customer.id}
AND bank_transfers.date < '#{Date.current}'
AND bank_transfers.date >= '#{final_past_date}'
GROUP BY day
  1. 或者使用字符串插入构造您的查询
subqueryA = 'CASE WHEN bank_transfers.amount_cents < 0 THEN bank_transfers.amount_cents END) AS BIGINT'
subqueryB = 'CASE WHEN bank_transfers.amount_cents > 0 THEN bank_transfers.amount_cents END) AS BIGINT'
...
SELECT
    bank_transfers.date AS day,
    CAST(SUM(bank_transfers.amount_cents) AS BIGINT) AS gross_value,
    CAST(#{subqueryA}) AS expenses_sum,
    CAST(#{subqueryB}) AS revenues_sum
FROM bank_transfers
JOIN customers ON customers.id = bank_transfers.customer_id
WHERE customers.id = #{customer.id}
AND bank_transfers.date < '#{Date.current}'
AND bank_transfers.date >= '#{final_past_date}'
GROUP BY day

【讨论】:

    猜你喜欢
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2021-06-28
    • 2013-12-21
    • 2020-01-08
    • 2016-02-16
    相关资源
    最近更新 更多