From a7cc505b53071ca1101c8d35193fa2e46bf3b2f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Sun, 30 Jul 2017 22:34:02 +0200 Subject: [PATCH] Support geometry column with no typmod --- geoalchemy2/types.py | 15 +++++++++++++-- tests/test_types.py | 8 ++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/geoalchemy2/types.py b/geoalchemy2/types.py index a6984a3c..6dd85f06 100644 --- a/geoalchemy2/types.py +++ b/geoalchemy2/types.py @@ -6,6 +6,7 @@ Reference --------- """ +import warnings from sqlalchemy.types import UserDefinedType, Integer from sqlalchemy.sql import func @@ -47,11 +48,15 @@ class _GISType(UserDefinedType): * ``"MULTILINESTRING"``, * ``"MULTIPOLYGON"``, * ``"GEOMETRYCOLLECTION"`` - * ``"CURVE"``. + * ``"CURVE"``, + * ``None``. The latter is actually not supported with :class:`geoalchemy2.types.Geography`. + When set to ``None`` then no "geometry type" constraints will be attached to the geometry + type declaration. + Default is ``"GEOMETRY"``. ``srid`` @@ -103,8 +108,12 @@ class _GISType(UserDefinedType): def __init__(self, geometry_type='GEOMETRY', srid=-1, dimension=2, spatial_index=True, management=False, use_typmod=None): - self.geometry_type = geometry_type.upper() + self.geometry_type = geometry_type self.srid = int(srid) + if self.geometry_type: + self.geometry_type = self.geometry_type.upper() + elif self.srid > 0: + warnings.warn('srid not enforced when geometry_type is None') self.dimension = dimension self.spatial_index = spatial_index self.management = management @@ -112,6 +121,8 @@ def __init__(self, geometry_type='GEOMETRY', srid=-1, dimension=2, self.extended = self.as_binary == 'ST_AsEWKB' def get_col_spec(self): + if not self.geometry_type: + return self.name return '%s(%s,%d)' % (self.name, self.geometry_type, self.srid) def column_expression(self, col): diff --git a/tests/test_types.py b/tests/test_types.py index d5f45cc1..21d60388 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -35,6 +35,10 @@ def test_get_col_spec(self): g = Geometry(srid=900913) assert g.get_col_spec() == 'geometry(GEOMETRY,900913)' + def test_get_col_spec_no_typmod(self): + g = Geometry(geometry_type=None) + assert g.get_col_spec() == 'geometry' + def test_column_expression(self, geometry_table): s = select([geometry_table.c.geom]) eq_sql(s, 'SELECT ST_AsEWKB("table".geom) AS geom FROM "table"') @@ -77,6 +81,10 @@ def test_get_col_spec(self): g = Geography(srid=900913) assert g.get_col_spec() == 'geography(GEOMETRY,900913)' + def test_get_col_spec_no_typmod(self): + g = Geography(geometry_type=None) + assert g.get_col_spec() == 'geography' + def test_column_expression(self, geography_table): s = select([geography_table.c.geom]) eq_sql(s, 'SELECT ST_AsBinary("table".geom) AS geom FROM "table"')