You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postgres查询在客户端正常但在Rails ActiveRecord报错排查

Postgres查询在客户端正常但Rails执行报错

问题详情

我有一段Postgres查询在Postgres客户端中运行正常,但在Rails中执行时出现语法错误。

查询代码

sql_query = <<-SQL.squish
  SELECT *
       , total_price - taxes - shipping - total_discount AS net_sales
  FROM (SELECT created_at
             , COALESCE(total_orders, 0)        AS total_orders
             , COALESCE(total_price, 0)         AS total_price
             , COALESCE(taxes, 0)               AS taxes
             , COALESCE(shipping, 0)            AS shipping
             , COALESCE(average_order_value, 0) AS average_order_value
             , COALESCE(total_discount, 0)      AS total_discount
        FROM generate_series(timestamp '2022-07-20'
                 , timestamp '2022-07-26'
                 , interval '1 day') AS g(created_at)
                 LEFT JOIN ( -- ③
            SELECT created_at::date
                 , count(*)            AS total_orders
                 , sum(total_price)    AS total_price
                 , sum(taxes)          AS taxes
                 , sum(shipping)       AS shipping
                 , avg(total_price)    AS average_order_value
                 , sum(total_discount) AS total_discount
            FROM orders
            WHERE shop_id = 43
              AND active                    
              AND created_at >= '2022-07-20'
              AND created_at < '2022-07-27'
            GROUP BY 1) o USING (created_at)
       ) sub
  ORDER BY created_at DESC;
SQL

ActiveRecord::Base.connection.execute(sql_query).values

报错信息

PG::SyntaxError: ERROR: syntax error at end of input LINE 1: ...P BY 1) o USING (created_at) ) sub ORDER BY created_at DESC; ^

问题原因

问题出在.squish方法的使用:

  • .squish会将所有多余空白(包括换行)压缩为单个空格,把整个SQL合并成一行;
  • 代码中的-- ③是Postgres单行注释,原本只会注释到该行末尾,但.squish去掉换行后,注释后面的子查询代码被并入同一行,导致这部分代码被注释掉,SQL结构缺失,引发语法错误。

解决办法

任选以下一种方式修复:

  • 替换注释格式:把单行注释-- ③改为多行注释/* ③ */,多行注释不受换行影响,.squish压缩后不会破坏SQL结构;
  • 替换字符串处理方法:用.strip替代.squish,.strip仅移除首尾空白,保留内部换行和必要空格,确保单行注释只作用于原行;
  • 删除注释:如果注释无保留必要,直接删除-- ③即可。

内容的提问来源于stack exchange,提问作者WagnerMatosUK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:27:24