Antes de la actualización:
Ejecutar
SELECT
pa.attrelid::REGCLASS, pa.attname
FROM
pg_attribute AS pa
WHERE
pa.attrelid = '<schema>.<table>'::REGCLASS
AND
pa.attnum > 0
AND
pa.attname LIKE '%_wkt'
;
para encontrar todas las columnas con sufijo _wkt
en <schema>.<table>
(sustituya la consulta anterior por los nombres reales del esquema y de las tablas; no elimine el carácter '
!).
Asegúrese de que la tabla y las columnas devueltas son exactamente los que quiera actualizar - ¡ni más ni menos!
Si está seguro de que no hay otras relaciones o columnas implicadas, ejecute
DO
$DO$
DECLARE
_rnm REGCLASS;
_cnm TEXT;
BEGIN
FOR _rnm, _cnm IN (
SELECT
pa.attrelid::REGCLASS, pa.attname
FROM
pg_attribute AS pa
WHERE
pa.attrelid = '<schema>.<table>'::REGCLASS
AND
pa.attnum > 0
AND
pa.attname LIKE '%_wkt'
) LOOP
EXECUTE FORMAT(
$FORMAT$
ALTER TABLE
%1$I
ALTER COLUMN
%2$s TYPE GEOMETRY(<GEOMETRY_TYPE>, <SRID>) USING %2$s::GEOMETRY(<GEOMETRY_TYPE>, <SRID>) ;
-- OPTIONAL: remove suffix '_wkt' from column name
ALTER TABLE
%1$I
RENAME COLUMN
%2$s TO %3$s
;
-- OPTIONAL: add spatial index
CREATE INDEX
ON %1$I
USING GIST(%3$s)
;
$FORMAT$,
_rnm, _cnm, REPLACE(_cnm, '_wkt', '') -- remove the REPLACE statement if you do not want any OPTIONAL functionality!
);
END LOOP;
END;
$DO$
;
De este modo
- actualizar el tipo de datos de la columna a
GEOMETRY(<GEOMETRY_TYPE>, <SRID>)
y registra correctamente la columna en las tablas del sistema (sustituye <GEOMETRY_TYPE>
y <SRID>
)
- OPCIONALMENTE retire el
_wkt
sufijo del nombre de la columna
- OPCIONALMENTE crear un índice espacial en el nuevo
GEOMETRY
columna
Si ha elegido la opción de índice, ejecute
VACUUM ANALYZE <schema>.<table>;
al finalizar.
Tenga en cuenta que debe definir específicamente el <GEOMETRY_TYPE>
y <SRID>
- se utilizará para todos columnas actualizadas.
Si sus columnas contienen diferentes <GEOMETRY_TYPE>
tendrá que optar por utilizar el genérico GEOMETRY(GEOMETRY, <SRID>)
o simplemente GEOMETRY
sin <SRID>
información -lo cual es indeseable- o añadir una declaración más compleja para intentar deducir la <GEOMETRY_TYPE>
a partir de los valores de las columnas; añade una nota si ese es el caso y puedo ver si tengo tiempo para añadir la lógica.