浏览代码

Fixed #33675 -- Dropped support for PostgreSQL 10 and PostGIS 2.4.

Mariusz Felisiak 2 年之前
父节点
当前提交
37470bbd90

+ 1 - 3
django/contrib/gis/db/backends/postgis/operations.py

@@ -172,8 +172,6 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
             "BoundingCircle": "ST_MinimumBoundingCircle",
             "BoundingCircle": "ST_MinimumBoundingCircle",
             "NumPoints": "ST_NPoints",
             "NumPoints": "ST_NPoints",
         }
         }
-        if self.spatial_version < (2, 4, 0):
-            function_names["ForcePolygonCW"] = "ST_ForceRHR"
         return function_names
         return function_names
 
 
     @cached_property
     @cached_property
@@ -199,7 +197,7 @@ class PostGISOperations(BaseSpatialOperations, DatabaseOperations):
                 raise ImproperlyConfigured(
                 raise ImproperlyConfigured(
                     'Cannot determine PostGIS version for database "%s" '
                     'Cannot determine PostGIS version for database "%s" '
                     'using command "SELECT postgis_lib_version()". '
                     'using command "SELECT postgis_lib_version()". '
-                    "GeoDjango requires at least PostGIS version 2.4. "
+                    "GeoDjango requires at least PostGIS version 2.5. "
                     "Was the database created from a spatial database "
                     "Was the database created from a spatial database "
                     "template?" % self.connection.settings_dict["NAME"]
                     "template?" % self.connection.settings_dict["NAME"]
                 )
                 )

+ 2 - 7
django/db/backends/postgresql/features.py

@@ -6,7 +6,7 @@ from django.utils.functional import cached_property
 
 
 
 
 class DatabaseFeatures(BaseDatabaseFeatures):
 class DatabaseFeatures(BaseDatabaseFeatures):
-    minimum_database_version = (10,)
+    minimum_database_version = (11,)
     allows_group_by_selected_pks = True
     allows_group_by_selected_pks = True
     can_return_columns_from_insert = True
     can_return_columns_from_insert = True
     can_return_rows_from_bulk_insert = True
     can_return_rows_from_bulk_insert = True
@@ -59,6 +59,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
     json_key_contains_list_matching_requires_list = True
     json_key_contains_list_matching_requires_list = True
     supports_update_conflicts = True
     supports_update_conflicts = True
     supports_update_conflicts_with_target = True
     supports_update_conflicts_with_target = True
+    supports_covering_indexes = True
     test_collations = {
     test_collations = {
         "non_default": "sv-x-icu",
         "non_default": "sv-x-icu",
         "swedish_ci": "sv-x-icu",
         "swedish_ci": "sv-x-icu",
@@ -81,10 +82,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
             "PositiveSmallIntegerField": "SmallIntegerField",
             "PositiveSmallIntegerField": "SmallIntegerField",
         }
         }
 
 
-    @cached_property
-    def is_postgresql_11(self):
-        return self.connection.pg_version >= 110000
-
     @cached_property
     @cached_property
     def is_postgresql_12(self):
     def is_postgresql_12(self):
         return self.connection.pg_version >= 120000
         return self.connection.pg_version >= 120000
@@ -98,8 +95,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
         return self.connection.pg_version >= 140000
         return self.connection.pg_version >= 140000
 
 
     has_bit_xor = property(operator.attrgetter("is_postgresql_14"))
     has_bit_xor = property(operator.attrgetter("is_postgresql_14"))
-    has_websearch_to_tsquery = property(operator.attrgetter("is_postgresql_11"))
-    supports_covering_indexes = property(operator.attrgetter("is_postgresql_11"))
     supports_covering_gist_indexes = property(operator.attrgetter("is_postgresql_12"))
     supports_covering_gist_indexes = property(operator.attrgetter("is_postgresql_12"))
     supports_covering_spgist_indexes = property(operator.attrgetter("is_postgresql_14"))
     supports_covering_spgist_indexes = property(operator.attrgetter("is_postgresql_14"))
     supports_non_deterministic_collations = property(
     supports_non_deterministic_collations = property(

+ 1 - 2
docs/ref/contrib/gis/install/geolibs.txt

@@ -12,7 +12,7 @@ Program                   Description                           Required
 `PROJ`_                   Cartographic Projections library      Yes (PostgreSQL and SQLite only)  9.x, 8.x, 7.x, 6.x, 5.x, 4.x
 `PROJ`_                   Cartographic Projections library      Yes (PostgreSQL and SQLite only)  9.x, 8.x, 7.x, 6.x, 5.x, 4.x
 :doc:`GDAL <../gdal>`     Geospatial Data Abstraction Library   Yes                               3.4, 3.3, 3.2, 3.1, 3.0, 2.4, 2.3, 2.2
 :doc:`GDAL <../gdal>`     Geospatial Data Abstraction Library   Yes                               3.4, 3.3, 3.2, 3.1, 3.0, 2.4, 2.3, 2.2
 :doc:`GeoIP <../geoip2>`  IP-based geolocation library          No                                2
 :doc:`GeoIP <../geoip2>`  IP-based geolocation library          No                                2
-`PostGIS`__               Spatial extensions for PostgreSQL     Yes (PostgreSQL only)             3.2, 3.1, 3.0, 2.5, 2.4
+`PostGIS`__               Spatial extensions for PostgreSQL     Yes (PostgreSQL only)             3.2, 3.1, 3.0, 2.5
 `SpatiaLite`__            Spatial extensions for SQLite         Yes (SQLite only)                 5.0, 4.3
 `SpatiaLite`__            Spatial extensions for SQLite         Yes (SQLite only)                 5.0, 4.3
 ========================  ====================================  ================================  ======================================
 ========================  ====================================  ================================  ======================================
 
 
@@ -34,7 +34,6 @@ totally fine with GeoDjango. Your mileage may vary.
     GDAL 3.2.0 2020-11-02
     GDAL 3.2.0 2020-11-02
     GDAL 3.3.0 2021-05-03
     GDAL 3.3.0 2021-05-03
     GDAL 3.4.0 2021-11-04
     GDAL 3.4.0 2021-11-04
-    PostGIS 2.4.0 2017-09-30
     PostGIS 2.5.0 2018-09-23
     PostGIS 2.5.0 2018-09-23
     PostGIS 3.0.0 2019-10-20
     PostGIS 3.0.0 2019-10-20
     PostGIS 3.1.0 2020-12-18
     PostGIS 3.1.0 2020-12-18

+ 1 - 1
docs/ref/contrib/gis/install/index.txt

@@ -58,7 +58,7 @@ supported versions, and any notes for each of the supported database backends:
 ==================  ==============================  ==================  =========================================
 ==================  ==============================  ==================  =========================================
 Database            Library Requirements            Supported Versions  Notes
 Database            Library Requirements            Supported Versions  Notes
 ==================  ==============================  ==================  =========================================
 ==================  ==============================  ==================  =========================================
-PostgreSQL          GEOS, GDAL, PROJ, PostGIS       10+                 Requires PostGIS.
+PostgreSQL          GEOS, GDAL, PROJ, PostGIS       11+                 Requires PostGIS.
 MySQL               GEOS, GDAL                      5.7+                :ref:`Limited functionality <mysql-spatial-limitations>`.
 MySQL               GEOS, GDAL                      5.7+                :ref:`Limited functionality <mysql-spatial-limitations>`.
 Oracle              GEOS, GDAL                      19+                 XE not supported.
 Oracle              GEOS, GDAL                      19+                 XE not supported.
 SQLite              GEOS, GDAL, PROJ, SpatiaLite    3.9.0+              Requires SpatiaLite 4.3+
 SQLite              GEOS, GDAL, PROJ, SpatiaLite    3.9.0+              Requires SpatiaLite 4.3+

+ 0 - 5
docs/ref/contrib/postgres/indexes.txt

@@ -120,11 +120,6 @@ available from the ``django.contrib.postgres.indexes`` module.
     Provide an integer value from 10 to 100 to the fillfactor_ parameter to
     Provide an integer value from 10 to 100 to the fillfactor_ parameter to
     tune how packed the index pages will be. PostgreSQL's default is 90.
     tune how packed the index pages will be. PostgreSQL's default is 90.
 
 
-    .. admonition:: Use this index only on PostgreSQL 10 and later
-
-        Hash indexes have been available in PostgreSQL for a long time, but
-        they suffer from a number of data integrity issues in older versions.
-
     .. _fillfactor: https://www.postgresql.org/docs/current/sql-createindex.html#SQL-CREATEINDEX-STORAGE-PARAMETERS
     .. _fillfactor: https://www.postgresql.org/docs/current/sql-createindex.html#SQL-CREATEINDEX-STORAGE-PARAMETERS
 
 
 ``SpGistIndex``
 ``SpGistIndex``

+ 1 - 1
docs/ref/databases.txt

@@ -114,7 +114,7 @@ below for information on how to set up your database correctly.
 PostgreSQL notes
 PostgreSQL notes
 ================
 ================
 
 
-Django supports PostgreSQL 10 and higher. `psycopg2`_ 2.8.4 or higher is
+Django supports PostgreSQL 11 and higher. `psycopg2`_ 2.8.4 or higher is
 required, though the latest release is recommended.
 required, though the latest release is recommended.
 
 
 .. _psycopg2: https://www.psycopg.org/
 .. _psycopg2: https://www.psycopg.org/

+ 1 - 1
docs/ref/models/indexes.txt

@@ -214,7 +214,7 @@ See the PostgreSQL documentation for more details about `covering indexes`_.
 
 
 .. admonition:: Restrictions on PostgreSQL
 .. admonition:: Restrictions on PostgreSQL
 
 
-    PostgreSQL 11+ only supports covering B-Tree indexes, PostgreSQL 12+ also
+    PostgreSQL < 12 only supports covering B-Tree indexes, PostgreSQL 12+ also
     supports covering :class:`GiST indexes
     supports covering :class:`GiST indexes
     <django.contrib.postgres.indexes.GistIndex>`, and PostgreSQL 14+ also
     <django.contrib.postgres.indexes.GistIndex>`, and PostgreSQL 14+ also
     supports covering :class:`SP-GiST indexes
     supports covering :class:`SP-GiST indexes

+ 8 - 0
docs/releases/4.1.txt

@@ -453,6 +453,14 @@ backends.
 
 
 * Support for GDAL 2.1 is removed.
 * Support for GDAL 2.1 is removed.
 
 
+* Support for PostGIS 2.4 is removed.
+
+Dropped support for PostgreSQL 10
+---------------------------------
+
+Upstream support for PostgreSQL 10 ends in November 2022. Django 4.1 supports
+PostgreSQL 11 and higher.
+
 Dropped support for MariaDB 10.2
 Dropped support for MariaDB 10.2
 --------------------------------
 --------------------------------
 
 

+ 0 - 5
docs/topics/migrations.txt

@@ -69,11 +69,6 @@ PostgreSQL
 PostgreSQL is the most capable of all the databases here in terms of schema
 PostgreSQL is the most capable of all the databases here in terms of schema
 support.
 support.
 
 
-The only caveat is that prior to PostgreSQL 11, adding columns with default
-values causes a full rewrite of the table, for a time proportional to its size.
-For this reason, it's recommended you always create new columns with
-``null=True``, as this way they will be added immediately.
-
 MySQL
 MySQL
 -----
 -----
 
 

+ 2 - 2
tests/backends/postgresql/tests.py

@@ -315,9 +315,9 @@ class Tests(TestCase):
         new_connection.pg_version = 110009
         new_connection.pg_version = 110009
         self.assertEqual(new_connection.get_database_version(), (11, 9))
         self.assertEqual(new_connection.get_database_version(), (11, 9))
 
 
-    @mock.patch.object(connection, "get_database_version", return_value=(9, 6))
+    @mock.patch.object(connection, "get_database_version", return_value=(10,))
     def test_check_database_version_supported(self, mocked_get_database_version):
     def test_check_database_version_supported(self, mocked_get_database_version):
-        msg = "PostgreSQL 10 or later is required (found 9.6)."
+        msg = "PostgreSQL 11 or later is required (found 10)."
         with self.assertRaisesMessage(NotSupportedError, msg):
         with self.assertRaisesMessage(NotSupportedError, msg):
             connection.check_database_version_supported()
             connection.check_database_version_supported()
         self.assertTrue(mocked_get_database_version.called)
         self.assertTrue(mocked_get_database_version.called)

+ 1 - 3
tests/postgres_tests/test_search.py

@@ -7,7 +7,7 @@ transcript.
 """
 """
 from django.db import connection
 from django.db import connection
 from django.db.models import F, Value
 from django.db.models import F, Value
-from django.test import modify_settings, skipUnlessDBFeature
+from django.test import modify_settings
 
 
 from . import PostgreSQLSimpleTestCase, PostgreSQLTestCase
 from . import PostgreSQLSimpleTestCase, PostgreSQLTestCase
 from .models import Character, Line, LineSavedSearch, Scene
 from .models import Character, Line, LineSavedSearch, Scene
@@ -265,7 +265,6 @@ class MultipleFieldsTest(GrailTestData, PostgreSQLTestCase):
         )
         )
         self.assertSequenceEqual(searched, [self.french])
         self.assertSequenceEqual(searched, [self.french])
 
 
-    @skipUnlessDBFeature("has_websearch_to_tsquery")
     def test_web_search(self):
     def test_web_search(self):
         line_qs = Line.objects.annotate(search=SearchVector("dialogue"))
         line_qs = Line.objects.annotate(search=SearchVector("dialogue"))
         searched = line_qs.filter(
         searched = line_qs.filter(
@@ -290,7 +289,6 @@ class MultipleFieldsTest(GrailTestData, PostgreSQLTestCase):
         )
         )
         self.assertSequenceEqual(searched, [self.verse0, self.verse1])
         self.assertSequenceEqual(searched, [self.verse0, self.verse1])
 
 
-    @skipUnlessDBFeature("has_websearch_to_tsquery")
     def test_web_search_with_config(self):
     def test_web_search_with_config(self):
         line_qs = Line.objects.annotate(
         line_qs = Line.objects.annotate(
             search=SearchVector("scene__setting", "dialogue", config="french"),
             search=SearchVector("scene__setting", "dialogue", config="french"),