fix(db): corregir migración 09 — dropear vista y función antes de alterar columna

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 <noreply@anthropic.com>
This commit is contained in:
2026-04-01 20:06:33 -05:00
parent ccbb7deea4
commit 6982f1d4d2

View File

@ -7,7 +7,82 @@
-- (likes + compartidos*3) / vistas * 100 puede superar 100 -- (likes + compartidos*3) / vistas * 100 puede superar 100
-- y Postgres lanza "numeric field overflow". -- y Postgres lanza "numeric field overflow".
-- SOLUCIÓN: ampliar a numeric(10,4) → soporta hasta 999999.9999 -- 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 table guiones
alter column score_engagement type numeric(10,4); 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;