From 6982f1d4d219c810b560fe299278e56979eff414 Mon Sep 17 00:00:00 2001 From: Hanzo_dev <2002samudiojohan@gmail.com> Date: Wed, 1 Apr 2026 20:06:33 -0500 Subject: [PATCH] =?UTF-8?q?fix(db):=20corregir=20migraci=C3=B3n=2009=20?= =?UTF-8?q?=E2=80=94=20dropear=20vista=20y=20funci=C3=B3n=20antes=20de=20a?= =?UTF-8?q?lterar=20columna?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Postgres no permite alterar el tipo de una columna usada por una vista o función. La migración ahora dropea vista_resumen_nichos y buscar_guiones_similares, altera score_engagement a numeric(10,4) y las recrea con el nuevo tipo. Co-Authored-By: Claude Sonnet 4.6 --- .../migrations/09_fix_score_engagement.sql | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/database/migrations/09_fix_score_engagement.sql b/database/migrations/09_fix_score_engagement.sql index b85c16b..6aae057 100644 --- a/database/migrations/09_fix_score_engagement.sql +++ b/database/migrations/09_fix_score_engagement.sql @@ -7,7 +7,82 @@ -- (likes + compartidos*3) / vistas * 100 puede superar 100 -- y Postgres lanza "numeric field overflow". -- SOLUCIÓN: ampliar a numeric(10,4) → soporta hasta 999999.9999 +-- +-- Hay que dropear la vista y la función que dependen del tipo +-- antes de alterar la columna, y recrearlas después. -- ============================================================ +-- 1. Dropear dependencias +drop view if exists vista_resumen_nichos; +drop function if exists buscar_guiones_similares(vector(1536), text, integer, uuid, boolean); + +-- 2. Alterar la columna alter table guiones alter column score_engagement type numeric(10,4); + +-- 3. Recrear función buscar_guiones_similares con el nuevo tipo +create or replace function buscar_guiones_similares( + p_vector vector(1536), + p_niche text, + p_limite integer default 5, + p_cliente_id uuid default null, + p_solo_exitosos boolean default true +) +returns table ( + id uuid, + niche text, + sub_niche text, + plataforma plataforma_enum, + gancho_texto text, + estructura_narrativa estructura_narrativa_enum, + trigger_emocional trigger_emocional_enum, + score_engagement numeric(10,4), + score_virabilidad integer, + score_cialdini integer, + resumen_patron text, + similitud float +) +language sql stable +as $$ + select + g.id, + g.niche, + g.sub_niche, + g.plataforma, + g.gancho_texto, + g.estructura_narrativa, + g.trigger_emocional, + g.score_engagement, + g.score_virabilidad, + g.score_cialdini, + g.resumen_patron, + 1 - (g.embedding_vector <=> p_vector) as similitud + from guiones g + where + g.procesado_ok = true + and g.embedding_vector is not null + and g.niche = p_niche + and (p_cliente_id is null or g.cliente_id = p_cliente_id) + and (not p_solo_exitosos or (g.score_engagement is not null and g.score_engagement > 0)) + order by + g.embedding_vector <=> p_vector + limit p_limite; +$$; + +-- 4. Recrear vista vista_resumen_nichos +create or replace view vista_resumen_nichos as +select + g.niche, + g.cliente_id, + c.nombre as cliente_nombre, + count(*) as total_guiones, + round(avg(g.score_engagement)::numeric, 4) as engagement_promedio, + round(avg(g.score_virabilidad)::numeric, 1) as virabilidad_promedio, + round(avg(g.score_cialdini)::numeric, 1) as cialdini_promedio, + max(g.score_engagement) as mejor_engagement, + max(g.fecha_analisis) as ultimo_analisis +from guiones g +left join clientes c on c.id = g.cliente_id +where g.procesado_ok = true +group by g.niche, g.cliente_id, c.nombre +order by engagement_promedio desc nulls last;