Fixed #31579 -- Dropped support for PostgreSQL 9.5 and PostGIS 2.2.
This commit is contained in:
parent
50798d4389
commit
e536fa5ce1
|
@ -180,7 +180,7 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
|
|||
raise ImproperlyConfigured(
|
||||
'Cannot determine PostGIS version for database "%s" '
|
||||
'using command "SELECT postgis_lib_version()". '
|
||||
'GeoDjango requires at least PostGIS version 2.2. '
|
||||
'GeoDjango requires at least PostGIS version 2.3. '
|
||||
'Was the database created from a spatial database '
|
||||
'template?' % self.connection.settings_dict['NAME']
|
||||
)
|
||||
|
|
|
@ -68,10 +68,6 @@ class BloomIndex(PostgresIndex):
|
|||
kwargs['columns'] = self.columns
|
||||
return path, args, kwargs
|
||||
|
||||
def check_supported(self, schema_editor):
|
||||
if not schema_editor.connection.features.has_bloom_index:
|
||||
raise NotSupportedError('Bloom indexes require PostgreSQL 9.6+.')
|
||||
|
||||
def get_with_params(self):
|
||||
with_params = []
|
||||
if self.length is not None:
|
||||
|
|
|
@ -59,10 +59,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
|||
validates_explain_options = False # A query will error on invalid options.
|
||||
supports_deferrable_unique_constraints = True
|
||||
|
||||
@cached_property
|
||||
def is_postgresql_9_6(self):
|
||||
return self.connection.pg_version >= 90600
|
||||
|
||||
@cached_property
|
||||
def is_postgresql_10(self):
|
||||
return self.connection.pg_version >= 100000
|
||||
|
@ -75,8 +71,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
|
|||
def is_postgresql_12(self):
|
||||
return self.connection.pg_version >= 120000
|
||||
|
||||
has_bloom_index = property(operator.attrgetter('is_postgresql_9_6'))
|
||||
has_brin_autosummarize = property(operator.attrgetter('is_postgresql_10'))
|
||||
has_phraseto_tsquery = property(operator.attrgetter('is_postgresql_9_6'))
|
||||
has_websearch_to_tsquery = property(operator.attrgetter('is_postgresql_11'))
|
||||
supports_table_partitions = property(operator.attrgetter('is_postgresql_10'))
|
||||
|
|
|
@ -12,7 +12,7 @@ Program Description Required
|
|||
`PROJ`_ Cartographic Projections library Yes (PostgreSQL and SQLite only) 6.x, 5.x, 4.x
|
||||
:doc:`GDAL <../gdal>` Geospatial Data Abstraction Library Yes 3.1, 3.0, 2.4, 2.3, 2.2, 2.1, 2.0
|
||||
:doc:`GeoIP <../geoip2>` IP-based geolocation library No 2
|
||||
`PostGIS`__ Spatial extensions for PostgreSQL Yes (PostgreSQL only) 3.0, 2.5, 2.4, 2.3, 2.2
|
||||
`PostGIS`__ Spatial extensions for PostgreSQL Yes (PostgreSQL only) 3.0, 2.5, 2.4, 2.3
|
||||
`SpatiaLite`__ Spatial extensions for SQLite Yes (SQLite only) 4.3
|
||||
======================== ==================================== ================================ ===================================
|
||||
|
||||
|
@ -32,7 +32,6 @@ totally fine with GeoDjango. Your mileage may vary.
|
|||
GDAL 2.4.0 2018-12
|
||||
GDAL 3.0.0 2019-05
|
||||
GDAL 3.1.0 2020-05-07
|
||||
PostGIS 2.2.0 2015-10-17
|
||||
PostGIS 2.3.0 2016-09-26
|
||||
PostGIS 2.4.0 2017-09-30
|
||||
PostGIS 2.5.0 2018-09-23
|
||||
|
|
|
@ -58,7 +58,7 @@ supported versions, and any notes for each of the supported database backends:
|
|||
================== ============================== ================== =========================================
|
||||
Database Library Requirements Supported Versions Notes
|
||||
================== ============================== ================== =========================================
|
||||
PostgreSQL GEOS, GDAL, PROJ, PostGIS 9.5+ Requires PostGIS.
|
||||
PostgreSQL GEOS, GDAL, PROJ, PostGIS 9.6+ Requires PostGIS.
|
||||
MySQL GEOS, GDAL 5.6.1+ :ref:`Limited functionality <mysql-spatial-limitations>`.
|
||||
Oracle GEOS, GDAL 12.2+ XE not supported.
|
||||
SQLite GEOS, GDAL, PROJ, SpatiaLite 3.8.3+ Requires SpatiaLite 4.3+
|
||||
|
|
|
@ -103,7 +103,7 @@ below for information on how to set up your database correctly.
|
|||
PostgreSQL notes
|
||||
================
|
||||
|
||||
Django supports PostgreSQL 9.5 and higher. `psycopg2`_ 2.5.4 or higher is
|
||||
Django supports PostgreSQL 9.6 and higher. `psycopg2`_ 2.5.4 or higher is
|
||||
required, though the latest release is recommended.
|
||||
|
||||
.. _psycopg2: https://www.psycopg.org/
|
||||
|
|
|
@ -224,6 +224,17 @@ backends.
|
|||
|
||||
* ...
|
||||
|
||||
:mod:`django.contrib.gis`
|
||||
-------------------------
|
||||
|
||||
* Support for PostGIS 2.2 is removed.
|
||||
|
||||
Dropped support for PostgreSQL 9.5
|
||||
----------------------------------
|
||||
|
||||
Upstream support for PostgreSQL 9.5 ends in February 2021. Django 3.2 supports
|
||||
PostgreSQL 9.6 and higher.
|
||||
|
||||
Miscellaneous
|
||||
-------------
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from unittest import mock
|
||||
|
||||
from django.db import connection, migrations
|
||||
from django.db import migrations
|
||||
|
||||
try:
|
||||
from django.contrib.postgres.operations import (
|
||||
|
@ -23,11 +23,7 @@ except ImportError:
|
|||
class Migration(migrations.Migration):
|
||||
|
||||
operations = [
|
||||
(
|
||||
BloomExtension()
|
||||
if getattr(connection.features, 'has_bloom_index', False)
|
||||
else mock.Mock()
|
||||
),
|
||||
BloomExtension(),
|
||||
BtreeGinExtension(),
|
||||
BtreeGistExtension(),
|
||||
CITextExtension(),
|
||||
|
|
|
@ -260,7 +260,6 @@ class SchemaTests(PostgreSQLTestCase):
|
|||
editor.remove_index(IntegerArrayModel, index)
|
||||
self.assertNotIn(index_name, self.get_constraints(IntegerArrayModel._meta.db_table))
|
||||
|
||||
@skipUnlessDBFeature('has_bloom_index')
|
||||
def test_bloom_index(self):
|
||||
index_name = 'char_field_model_field_bloom'
|
||||
index = BloomIndex(fields=['field'], name=index_name)
|
||||
|
@ -272,7 +271,6 @@ class SchemaTests(PostgreSQLTestCase):
|
|||
editor.remove_index(CharFieldModel, index)
|
||||
self.assertNotIn(index_name, self.get_constraints(CharFieldModel._meta.db_table))
|
||||
|
||||
@skipUnlessDBFeature('has_bloom_index')
|
||||
def test_bloom_parameters(self):
|
||||
index_name = 'char_field_model_field_bloom_params'
|
||||
index = BloomIndex(fields=['field'], name=index_name, length=512, columns=[3])
|
||||
|
@ -285,16 +283,6 @@ class SchemaTests(PostgreSQLTestCase):
|
|||
editor.remove_index(CharFieldModel, index)
|
||||
self.assertNotIn(index_name, self.get_constraints(CharFieldModel._meta.db_table))
|
||||
|
||||
def test_bloom_index_not_supported(self):
|
||||
index_name = 'bloom_index_exception'
|
||||
index = BloomIndex(fields=['field'], name=index_name)
|
||||
msg = 'Bloom indexes require PostgreSQL 9.6+.'
|
||||
with self.assertRaisesMessage(NotSupportedError, msg):
|
||||
with mock.patch('django.db.backends.postgresql.features.DatabaseFeatures.has_bloom_index', False):
|
||||
with connection.schema_editor() as editor:
|
||||
editor.add_index(CharFieldModel, index)
|
||||
self.assertNotIn(index_name, self.get_constraints(CharFieldModel._meta.db_table))
|
||||
|
||||
def test_brin_index(self):
|
||||
index_name = 'char_field_model_field_brin'
|
||||
index = BrinIndex(fields=['field'], name=index_name, pages_per_range=4)
|
||||
|
|
|
@ -195,7 +195,6 @@ class MultipleFieldsTest(GrailTestData, PostgreSQLTestCase):
|
|||
).filter(search=str(self.crowd.id))
|
||||
self.assertSequenceEqual(searched, [self.crowd])
|
||||
|
||||
@skipUnlessDBFeature('has_phraseto_tsquery')
|
||||
def test_phrase_search(self):
|
||||
line_qs = Line.objects.annotate(search=SearchVector('dialogue'))
|
||||
searched = line_qs.filter(search=SearchQuery('burned body his away', search_type='phrase'))
|
||||
|
@ -203,7 +202,6 @@ class MultipleFieldsTest(GrailTestData, PostgreSQLTestCase):
|
|||
searched = line_qs.filter(search=SearchQuery('his body burned away', search_type='phrase'))
|
||||
self.assertSequenceEqual(searched, [self.verse1])
|
||||
|
||||
@skipUnlessDBFeature('has_phraseto_tsquery')
|
||||
def test_phrase_search_with_config(self):
|
||||
line_qs = Line.objects.annotate(
|
||||
search=SearchVector('scene__setting', 'dialogue', config='french'),
|
||||
|
@ -386,7 +384,6 @@ class TestCombinations(GrailTestData, PostgreSQLTestCase):
|
|||
)
|
||||
self.assertSequenceEqual(searched, [self.verse2])
|
||||
|
||||
@skipUnlessDBFeature('has_phraseto_tsquery')
|
||||
def test_combine_raw_phrase(self):
|
||||
searched = Line.objects.filter(
|
||||
dialogue__search=(
|
||||
|
|
Loading…
Reference in New Issue