PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Il tipo di Postgres {tipo di campo} è solo una shell

In breve, devi reinstallare postgis, possibilmente solo drop extension postgis; e create extension postgis; .

Spiegazione più lunga

Potresti forse mancare solo questo tipo, ma dubito che sia solo questo, anche se se vuoi provare, ecco da 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.';

Per quanto riguarda le shell, puoi leggere di più su di esse nella documentazione .

In breve :Alcuni tipi richiedono funzioni che a loro volta richiedono la dichiarazione di quel tipo con, quindi non è possibile crearne nessuna, normalmente.

Per ovviare a questo problema, Postgres creerà tipi di shell che sono praticamente segnaposto solo per soddisfare la convalida.

Nel tuo caso geometry è di tipo shell e non è stato dichiarato correttamente, con significa che Postgis non è stato installato correttamente.

Il tipo di shell è simile a questo:

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;

E la funzione che richiede il tipo di shell potrebbe essere:

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

Se guardi indietro alla corretta geometry definizione noterai che questa funzione ne fa parte, ma non in questa shell.