Fixed #23514 -- Prevented queries in PostGISOperations init

Thanks Mattia Procopio for the report.
This commit is contained in:
Claude Paroz 2014-09-18 18:11:37 +02:00
parent 4dcfacb5b9
commit abc11b0a33
2 changed files with 33 additions and 10 deletions

View File

@ -176,10 +176,6 @@ class PostGISOperations(DatabaseOperations, BaseSpatialOperations):
'bboverlaps': PostGISOperator('&&'), 'bboverlaps': PostGISOperator('&&'),
} }
# Native geometry type support added in PostGIS 2.0.
if self.spatial_version >= (2, 0, 0):
self.geometry = True
# Creating a dictionary lookup of all GIS terms for PostGIS. # Creating a dictionary lookup of all GIS terms for PostGIS.
self.gis_terms = set(['isnull']) self.gis_terms = set(['isnull'])
self.gis_terms.update(self.geometry_operators) self.gis_terms.update(self.geometry_operators)
@ -220,14 +216,33 @@ class PostGISOperations(DatabaseOperations, BaseSpatialOperations):
self.union = prefix + 'Union' self.union = prefix + 'Union'
self.unionagg = prefix + 'Union' self.unionagg = prefix + 'Union'
# Following "attributes" are properties due to the spatial_version check and
# to delay database access
@property
def extent3d(self):
if self.spatial_version >= (2, 0, 0): if self.spatial_version >= (2, 0, 0):
self.extent3d = prefix + '3DExtent' return self.geom_func_prefix + '3DExtent'
self.length3d = prefix + '3DLength'
self.perimeter3d = prefix + '3DPerimeter'
else: else:
self.extent3d = prefix + 'Extent3D' return self.geom_func_prefix + 'Extent3D'
self.length3d = prefix + 'Length3D'
self.perimeter3d = prefix + 'Perimeter3D' @property
def length3d(self):
if self.spatial_version >= (2, 0, 0):
return self.geom_func_prefix + '3DLength'
else:
return self.geom_func_prefix + 'Length3D'
@property
def perimeter3d(self):
if self.spatial_version >= (2, 0, 0):
return self.geom_func_prefix + '3DPerimeter'
else:
return self.geom_func_prefix + 'Perimeter3D'
@property
def geometry(self):
# Native geometry type support added in PostGIS 2.0.
return self.spatial_version >= (2, 0, 0)
@cached_property @cached_property
def spatial_version(self): def spatial_version(self):

View File

@ -571,6 +571,14 @@ class BackendTestCase(TestCase):
self.assertTrue(hasattr(connection.ops, 'connection')) self.assertTrue(hasattr(connection.ops, 'connection'))
self.assertEqual(connection, connection.ops.connection) self.assertEqual(connection, connection.ops.connection)
def test_database_operations_init(self):
"""
Test that DatabaseOperations initialization doesn't query the database.
See #17656.
"""
with self.assertNumQueries(0):
connection.ops.__class__(connection)
def test_cached_db_features(self): def test_cached_db_features(self):
self.assertIn(connection.features.supports_transactions, (True, False)) self.assertIn(connection.features.supports_transactions, (True, False))
self.assertIn(connection.features.supports_stddev, (True, False)) self.assertIn(connection.features.supports_stddev, (True, False))