PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Le type Postgres {type de champ} n'est qu'un shell

En bref, vous devez réinstaller postgis, éventuellement simplement drop extension postgis; et create extension postgis; .

Explication plus longue

Il se peut que vous manquiez juste ce type, mais je doute que ce soit juste ça, mais si vous voulez essayer, voici à partir de 2.3 :

CREATE TYPE public.geometry
   (INPUT=geometry_in,
       OUTPUT=geometry_out,
       RECEIVE=geometry_recv,
       SEND=geometry_send,
       TYPMOD_IN=geometry_typmod_in,
       TYPMOD_OUT=geometry_typmod_out,
       ANALYZE=geometry_analyze,
       CATEGORY='U', DEFAULT='',
       INTERNALLENGTH=-1, ALIGNMENT=double, STORAGE=MAIN);
ALTER TYPE public.geometry
  OWNER TO postgres;
COMMENT ON TYPE public.geometry
  IS 'postgis type: Planar spatial data type.';

Quant aux shells, vous pouvez en savoir plus à leur sujet dans la documentation .

En bref  :Certains types nécessitent des fonctions qui, à leur tour, nécessitent que le type avec soit déclaré, donc aucun ne peut être créé - normalement.

Afin de contourner ce problème, Postgres créera des types de shell qui sont à peu près des espaces réservés juste pour satisfaire la validation.

Dans votre cas geometry est de type shell et n'a pas été correctement déclaré, ce qui signifie que postgis n'a pas été installé correctement.

Le type de coque ressemble à ceci :

CREATE TYPE public.geometry
   (INPUT=shell_in,
       OUTPUT=shell_out,
       RECEIVE=-,
       SEND=-,
       ANALYZE=-,
       CATEGORY='P',
    PASSEDBYVALUE, DEFAULT='',
       INTERNALLENGTH=4, ALIGNMENT=int4, STORAGE=PLAIN);
ALTER TYPE public.geometry
  OWNER TO postgres;

Et la fonction nécessitant un type de shell pourrait être :

CREATE OR REPLACE FUNCTION geometry_in(cstring)
    RETURNS geometry
    AS '$libdir/postgis-2.3','LWGEOM_in'
    LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

Si vous regardez en arrière la bonne geometry définition, vous remarquerez que cette fonction en fait partie, mais pas dans ce shell.