我想使用 Persistent/Esqueleto 来实现计数估计。
本文推荐的一种方法是定义这样的函数
CREATE FUNCTION count_estimate(query text) RETURNS integer AS $$
DECLARE
  rec   record;
  rows  integer;
BEGIN
  FOR rec IN EXECUTE 'EXPLAIN ' || query LOOP
    rows := substring(rec."QUERY PLAN" FROM ' rows=([[:digit:]]+)');
    EXIT WHEN rows IS NOT NULL;
  END LOOP;
  RETURN rows;
END;
$$ LANGUAGE plpgsql VOLATILE STRICT;
然后像这样使用它
SELECT count_estimate('SELECT * FROM companies WHERE status = ''Active''');
为了使用该count_estimate功能,我需要(我认为?)呈现 Peristent/Equeleto 生成的查询,但是当我尝试使用 呈现查询时renderQuerySelect,我得到类似这样的结果
SELECT "companies"."id", "companies"."name", "companies"."status"
FROM "companies"
WHERE "companies"."status" IN (?)
; [PersistText "Active"]
这当然不能塞进count_estimate,因为它会在?占位符上出现语法错误。我也不能天真地替换?with "Active",因为它会在第一个双引号上出现语法错误。
如何以我的count_estimate函数可以接受的方式呈现查询?
我试过这样的东西,但它在运行时失败
getEstimate :: (Text, [PersistValue]) -> DB [Single Int]
getEstimate (query, params) = rawSql [st|
  SELECT count_estimate('#{query}');
  |] params