我想使用 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