SIU-Toba / framework

Framework para desarrollo rápido de aplicaciones web
http://toba.siu.edu.ar
21 stars 24 forks source link

Error al leer metadatos de tabla desde Toba Editor #166

Closed hfolgueira closed 1 year ago

hfolgueira commented 1 year ago

Estamos experimentando problemas cuando levantamos los metadatos de las tablas postgresql, desde Toba Editor, al utilizar algunas herramientas de migración, las cuales crean los campos autoincrementales de las PK, usando identity columns en lugar de la sintaxis para serial. Concretamente no reconoce el nombre de la secuencia y luego cuando se los utiliza en la sincronización de una relación rompe.

Probamos en 2 bases la creación de una tabla con la sintaxis identity columns, empleando la herramienta de migración y en la otra creando la tabla con la sintaxis para campos serial.

CREATE TABLE public.situacion_laboral ( id int4 NOT NULL GENERATED ALWAYS AS IDENTITY( INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1 NO CYCLE), descripcion varchar(255) NULL, CONSTRAINT situacion_laboral_pkey PRIMARY KEY (id) );

Ejecutamos en la base la query que lee los metadatos de la tabla

https://github.com/SIU-Toba/framework/blob/develop/php/lib/db/toba_db_postgres7.php#L972

Y el resultado no trajo el número de secuencia (ver la columna valor_predeterminado)

nombre tipo tipo_longitud longitud tipo_sql not_null tiene_predeterminado valor_predeterminado secuencia fk_tabla fk_campo orden tabla pk uk
id int4 4 -1 integer true false         1 situacion_laboral true true
descripcion varchar -1 259 character varying(255) false false         2 situacion_laboral false false

Ahora en la otra base creamos la tabla con serial:

CREATE TABLE public.situacion_laboral ( id serial4 NOT NULL, descripcion varchar(255) NOT NULL, CONSTRAINT situacion_laboral_pkey PRIMARY KEY (id) );

Ejecutamos la query que levanta los metadatos:

nombre tipo tipo_longitud longitud tipo_sql not_null tiene_predeterminado valor_predeterminado secuencia fk_tabla fk_campo orden tabla pk uk
id int4 4 -1 integer true true nextval('situacion_laboral_id_seq'::regclass)       1 situacion_laboral true true
descripcion varchar -1 259 character varying(255) true false         2 situacion_laboral false false

La consulta trae el número de secuencia en la columna valor_predeterminado. Si bien el serial sigue existiendo en postgres, la alternativa nueva con IDENTITY es compatible con el estandar SQL, y muchas herramientas (de migration sobre todo) estan empezando a implementar autoincrementales con esa forma de construcción de la tabla.

La solicitud mas sencilla, es modificar de alguna manera la consulta en

https://github.com/SIU-Toba/framework/blob/develop/php/lib/db/toba_db_postgres7.php#L972

para que el valor_predeterminado siga trayendo el valor correspondiente.

Una forma de ver esto fallando es, dentro del Toba Editor, crear un datos_tabla de una tabla con el id generado con el tipo de dato IDENTITY. Al querer leer los datos desde la DB,

imagen

Se puede observar el campo id sin la secuencia. Ya probamos que, agregando a mano el nombre de la secuencia, todo funciona perfecto.

Referencias:

https://www.postgresql.org/docs/11/sql-createtable.html

https://www.commandprompt.com/education/how-do-i-create-an-identity-column-in-postgresql/

https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-identity-column/

enfoqueNativo commented 1 year ago

@hfolgueira Acabo de hacer un PR con la modificacion correspondiente a los metodos encargados de recuperar los metadatos de la secuencia. Esto va a salir en la version 3.4.0 ya que tiene algun requerimiento minimo de la version de Postgres (debido a la funcion utilizada) y no puedo cambiarlo en una version de 3er digito.

Como workaround para versiones previas, podes cargar manualmente el nombre de la secuencia directamente en la creacion del DT y va a funcionar correctamente, la lectura de los metadatos solo es una ayuda para pre-cargar los valores.

El error reportado en la imagen no es representativo, ya que con tildar el check de PK la creacion del DT se lleva a cabo sin problemas.

De todas formas, gracias por el reporte :)

hfolgueira commented 1 year ago

Excelente, muchas gracias a ustedes. Se entiende y esta muy bien que lo incluyan en la versión 3.4.0.

Comparto lo que decís acerca del error en la imagen, nosotros habiamos probado la carga manual para solucionarlo como te describí en el issue.

Te comento algo más, ayer nos dimos cuenta que ese error aparecía con el DT existente, si agregabamos un nuevo DT no tiraba el error y solo había que cargar la secuencia.

enfoqueNativo commented 1 year ago

Comparto lo que decís acerca del error en la imagen, nosotros habiamos probado la carga manual para solucionarlo como te describí en el issue.

Tenes razón, se ve que lo lei pero no lo incorpore.. mis disculpas.

Te comento algo más, ayer nos dimos cuenta que ese error aparecía con el DT existente, si agregabamos un nuevo DT no tiraba el error y solo había que cargar la secuencia.

Entiendo que esto se da al ejecutar manualmente la re-lectura de lo metadatos del motor dado que se reemplazan los existentes por aquellos recuperados, hecho que elimina (al menos en el formulario) la informacion de la secuencia y dejaria al DT en una situacion diferente.