El CI que entró con el #31 y el #81 corre psql -f schema.sql sobre una base limpia. Ahí se ve esto:
psql:schema.sql:122: ERROR: relation "clan_members" does not exist
LINE 3: FROM clan_members cm
psql:schema.sql:138: ERROR: relation "clan_members" does not exist
LINE 3: FROM clan_members cm
El problema
En api/schema.sql el orden está invertido:
| Línea |
Qué hace |
| 109 |
SELECT ... FROM clan_members cm dentro de un CTE que alimenta un UPDATE characters |
| 126 |
el mismo CTE, alimentando un DELETE FROM clan_members |
| 135 |
DELETE FROM clan_members cm USING incompatible_members im |
| 147 |
CREATE TABLE IF NOT EXISTS clan_members (...) |
Las tres migraciones de datos corren antes de que exista la tabla.
Por qué importa
psql corre sin ON_ERROR_STOP, así que no aborta: reporta el error y sigue con la siguiente sentencia. El resultado es que el schema queda casi completo y las tres migraciones no se aplican nunca, en silencio.
Esas migraciones existen para expulsar de un clan a los personajes cuya facción es incompatible con la alineación del clan. Sobre una base nueva no hay datos que migrar, así que no se nota. Sobre una base que ya tiene miembros, el efecto es que quedan miembros incompatibles adentro y nadie se entera, porque el error se imprimió hace 500 líneas.
Qué hay que hacer
Criterios de aceptación
Evidencia que suma
Fuera de alcance
- Migrar a una herramienta de migraciones versionadas. Es una discusión aparte y más grande.
- Cambiar la lógica de compatibilidad entre facción y alineación. Sólo se trata de que corra.
Por dónde empezar
api/schema.sql, líneas 105 a 175. El bloque de clan_members está completo entre la 147 y la 174, incluyendo sus constraints e índices: es un movimiento en bloque, no una reescritura.
Estimación
Entre 2 y 4 horas. Nivel inicial a intermedio en SQL. Lo que lleva tiempo no es mover el bloque, es auditar las 629 líneas buscando el resto de los casos.
El CI que entró con el #31 y el #81 corre
psql -f schema.sqlsobre una base limpia. Ahí se ve esto:El problema
En
api/schema.sqlel orden está invertido:SELECT ... FROM clan_members cmdentro de un CTE que alimenta unUPDATE charactersDELETE FROM clan_membersDELETE FROM clan_members cm USING incompatible_members imCREATE TABLE IF NOT EXISTS clan_members (...)Las tres migraciones de datos corren antes de que exista la tabla.
Por qué importa
psqlcorre sinON_ERROR_STOP, así que no aborta: reporta el error y sigue con la siguiente sentencia. El resultado es que el schema queda casi completo y las tres migraciones no se aplican nunca, en silencio.Esas migraciones existen para expulsar de un clan a los personajes cuya facción es incompatible con la alineación del clan. Sobre una base nueva no hay datos que migrar, así que no se nota. Sobre una base que ya tiene miembros, el efecto es que quedan miembros incompatibles adentro y nadie se entera, porque el error se imprimió hace 500 líneas.
Qué hay que hacer
CREATE TABLE IF NOT EXISTS clan_members(línea 147) y susALTER TABLEe índices asociados por encima de la primera sentencia que usa la tabla.\set ON_ERROR_STOP onal principio deschema.sql, o pasar-v ON_ERROR_STOP=1en el paso de CI. Sin eso, el próximo error de orden vuelve a pasar desapercibido.Criterios de aceptación
psql -f schema.sqlsobre una base vacía termina sin una sola líneaERROR:.ON_ERROR_STOPactivo, el script corre de punta a punta y sale con código 0.schema.sqldos veces seguidas sobre la misma base sigue siendo idempotente, que es lo que hoy garantizan losIF NOT EXISTS.clan_membersse aplican de verdad: un test que inserte un miembro incompatible antes de correr el schema y verifique que quedó expulsado.APIdel CI pasa el pasoRun migrations / schemasin errores en el log.Evidencia que suma
psql -f schema.sqlsobre una base limpia, pegada como bloque de código, mostrando ceroERROR:.Fuera de alcance
Por dónde empezar
api/schema.sql, líneas 105 a 175. El bloque declan_membersestá completo entre la 147 y la 174, incluyendo sus constraints e índices: es un movimiento en bloque, no una reescritura.Estimación
Entre 2 y 4 horas. Nivel inicial a intermedio en SQL. Lo que lleva tiempo no es mover el bloque, es auditar las 629 líneas buscando el resto de los casos.