我使用Django& Postgres的。我的迁移包含这样的内容:
db.create_table('location_locationlevel', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name_0', self.gf('django.db.models.fields.CharField')(max_length=75, null=True, blank=True)),
('name_1', self.gf('django.db.models.fields.CharField')(max_length=75, null=True, blank=True)),
('name_2', self.gf('django.db.models.fields.CharField')(max_length=75, null=True, blank=True)),
('name_3', self.gf('django.db.models.fields.CharField')(max_length=75, null=True, blank=True)),
('name_4', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)),
('geom', self.gf('django.contrib.gis.db.models.fields.MultiPolygonField')()),
))
当我运行迁移时,我收到如下错误:
django.db.utils.DatabaseError: type "geometry" is only a shell
LINE 1: ...ABLE public.location_locationlevel ADD COLUMN geom geometry
^
QUERY: ALTER TABLE public.location_locationlevel ADD COLUMN geom geometry
CONTEXT: PL/pgSQL function addgeometrycolumn(character varying,character varying,character varying,character varying,integer,character varying,integer)
之前有没有人经历过这样的事情,解决方案是什么?
答案 0 :(得分:3)
简而言之,您需要重新安装postgis,可能只是drop extension postgis;
和create extension postgis;
。
你可能会错过这种类型,但我怀疑它只是那个,如果你想尝试,这里是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.';
至于什么shell,你可以在documentation中阅读更多关于它们的信息。
简而言之: 某些类型需要的函数又需要声明类型,因此都不能创建 - 通常。
为了解决这个问题,Postgres将创建几乎占位符的shell类型,以满足验证。
在您的情况下,geometry
是shell类型且未正确声明,意味着postgis未正确安装。
Shell类型如下所示:
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;
需要shell类型的函数可能是:
CREATE OR REPLACE FUNCTION geometry_in(cstring)
RETURNS geometry
AS '$libdir/postgis-2.3','LWGEOM_in'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
如果你回顾一下正确的geometry
定义,你会注意到这个函数是它的一部分,但不是在这个shell中。