fix(leads): replace ::interval cast with make_interval (psycopg v3 trap) (#1383 follow-up)
Some checks failed
CI / changes (push) Has been cancelled
CI / backend-tests (push) Has been cancelled
CI / frontend-tests (push) Has been cancelled
CI / openapi-codegen-check (push) Has been cancelled
CI / changes (pull_request) Successful in 8s
CI / backend-tests (pull_request) Has been cancelled
CI / frontend-tests (pull_request) Has been cancelled
CI / openapi-codegen-check (pull_request) Has been cancelled
Some checks failed
CI / changes (push) Has been cancelled
CI / backend-tests (push) Has been cancelled
CI / frontend-tests (push) Has been cancelled
CI / openapi-codegen-check (push) Has been cancelled
CI / changes (pull_request) Successful in 8s
CI / backend-tests (pull_request) Has been cancelled
CI / frontend-tests (pull_request) Has been cancelled
CI / openapi-codegen-check (pull_request) Has been cancelled
(:bind || ' months')::interval is a psycopg v3 SyntaxError — the driver sees '::' immediately after the bind placeholder token and chokes. Replace all 6 occurrences (admin_leads.py + analytics_queries.py) with make_interval(months => :bind) which is unambiguous to the parser and semantically identical.
This commit is contained in:
parent
f55e83a150
commit
bcb348da40
2 changed files with 7 additions and 9 deletions
|
|
@ -138,7 +138,7 @@ def leads_stats(
|
||||||
WITH window_leads AS (
|
WITH window_leads AS (
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM prinzip_leads
|
FROM prinzip_leads
|
||||||
WHERE created_at >= NOW() - (:m || ' months')::interval
|
WHERE created_at >= NOW() - make_interval(months => :m)
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT
|
||||||
(SELECT COUNT(*) FROM prinzip_leads) AS leads_total,
|
(SELECT COUNT(*) FROM prinzip_leads) AS leads_total,
|
||||||
|
|
|
||||||
|
|
@ -184,8 +184,7 @@ def quartirography(db: Session, source: str, region_id: int = 66) -> list[dict[s
|
||||||
-- ('2025-07-01' расширял «recent»-окно каждую неделю по мере
|
-- ('2025-07-01' расширял «recent»-окно каждую неделю по мере
|
||||||
-- доливки ETL новых report_months → перекос в сторону всё
|
-- доливки ETL новых report_months → перекос в сторону всё
|
||||||
-- более длинной истории). Тот же фикс, что #1203 и _BUCKET_SQL.
|
-- более длинной истории). Тот же фикс, что #1203 и _BUCKET_SQL.
|
||||||
AND period_start_date >= NOW()
|
AND period_start_date >= NOW() - make_interval(months => :months_window)
|
||||||
- (:months_window || ' months')::INTERVAL
|
|
||||||
),
|
),
|
||||||
bucketed AS (
|
bucketed AS (
|
||||||
SELECT CASE
|
SELECT CASE
|
||||||
|
|
@ -1169,7 +1168,7 @@ def prinzip_funnel_monthly(db: Session, months: int = 24) -> list[dict[str, Any]
|
||||||
"""
|
"""
|
||||||
SELECT month, source, leads, engaged, converted, conv_pct
|
SELECT month, source, leads, engaged, converted, conv_pct
|
||||||
FROM prinzip_funnel_monthly
|
FROM prinzip_funnel_monthly
|
||||||
WHERE month >= (CURRENT_DATE - (:months || ' months')::interval)::date
|
WHERE month >= (CURRENT_DATE - make_interval(months => :months))::date
|
||||||
ORDER BY month DESC, leads DESC
|
ORDER BY month DESC, leads DESC
|
||||||
"""
|
"""
|
||||||
),
|
),
|
||||||
|
|
@ -1203,7 +1202,7 @@ def prinzip_funnel_by_source(db: Session, months: int = 12) -> list[dict[str, An
|
||||||
SUM(converted) AS converted,
|
SUM(converted) AS converted,
|
||||||
ROUND(100.0 * SUM(converted) / NULLIF(SUM(leads), 0), 2) AS conv_pct
|
ROUND(100.0 * SUM(converted) / NULLIF(SUM(leads), 0), 2) AS conv_pct
|
||||||
FROM prinzip_funnel_monthly
|
FROM prinzip_funnel_monthly
|
||||||
WHERE month >= (CURRENT_DATE - (:months || ' months')::interval)::date
|
WHERE month >= (CURRENT_DATE - make_interval(months => :months))::date
|
||||||
GROUP BY source
|
GROUP BY source
|
||||||
ORDER BY leads DESC
|
ORDER BY leads DESC
|
||||||
"""
|
"""
|
||||||
|
|
@ -1364,8 +1363,7 @@ _BUCKET_SQL = text(
|
||||||
AND deal_count > 0
|
AND deal_count > 0
|
||||||
AND (area / deal_count) BETWEEN 15 AND 200
|
AND (area / deal_count) BETWEEN 15 AND 200
|
||||||
AND price_per_sqm BETWEEN 30000 AND 1000000
|
AND price_per_sqm BETWEEN 30000 AND 1000000
|
||||||
AND period_start_date >= NOW()
|
AND period_start_date >= NOW() - make_interval(months => :months_window)
|
||||||
- (:months_window || ' months')::INTERVAL
|
|
||||||
),
|
),
|
||||||
bucketed AS (
|
bucketed AS (
|
||||||
SELECT CASE
|
SELECT CASE
|
||||||
|
|
@ -1995,7 +1993,7 @@ def _elasticity_coef(
|
||||||
{where_district}
|
{where_district}
|
||||||
{where_class}
|
{where_class}
|
||||||
AND crm.deals_total_avg_price_thousand_rub_per_m2 > 0
|
AND crm.deals_total_avg_price_thousand_rub_per_m2 > 0
|
||||||
AND crm.report_month >= NOW() - (:ew || ' months')::interval
|
AND crm.report_month >= NOW() - make_interval(months => :ew)
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT
|
||||||
regr_slope(y, x) AS slope,
|
regr_slope(y, x) AS slope,
|
||||||
|
|
@ -2086,7 +2084,7 @@ def _elasticity_per_bucket_coef(
|
||||||
{where_class}
|
{where_class}
|
||||||
AND crm.deals_total_count > 0
|
AND crm.deals_total_count > 0
|
||||||
AND crm.deals_total_avg_price_thousand_rub_per_m2 > 0
|
AND crm.deals_total_avg_price_thousand_rub_per_m2 > 0
|
||||||
AND crm.report_month >= NOW() - (:ew || ' months')::interval
|
AND crm.report_month >= NOW() - make_interval(months => :ew)
|
||||||
)
|
)
|
||||||
SELECT bucket,
|
SELECT bucket,
|
||||||
regr_slope(y, x) AS slope,
|
regr_slope(y, x) AS slope,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue