diff --git a/django/db/backends/postgresql/features.py b/django/db/backends/postgresql/features.py index abcfdf376d..864bcf3919 100644 --- a/django/db/backends/postgresql/features.py +++ b/django/db/backends/postgresql/features.py @@ -79,6 +79,10 @@ class DatabaseFeatures(BaseDatabaseFeatures): def is_postgresql_12(self): return self.connection.pg_version >= 120000 + @cached_property + def is_postgresql_13(self): + return self.connection.pg_version >= 130000 + has_brin_autosummarize = property(operator.attrgetter('is_postgresql_10')) has_websearch_to_tsquery = property(operator.attrgetter('is_postgresql_11')) supports_table_partitions = property(operator.attrgetter('is_postgresql_10')) diff --git a/docs/ref/contrib/postgres/functions.txt b/docs/ref/contrib/postgres/functions.txt index 2c00ce8a1a..447af266a2 100644 --- a/docs/ref/contrib/postgres/functions.txt +++ b/docs/ref/contrib/postgres/functions.txt @@ -14,8 +14,8 @@ All of these functions are available from the Returns a version 4 UUID. -The `pgcrypto extension`_ must be installed. You can use the -:class:`~django.contrib.postgres.operations.CryptoExtension` migration +On PostgreSQL < 13, the `pgcrypto extension`_ must be installed. You can use +the :class:`~django.contrib.postgres.operations.CryptoExtension` migration operation to install it. .. _pgcrypto extension: https://www.postgresql.org/docs/current/pgcrypto.html diff --git a/tests/postgres_tests/migrations/0001_setup_extensions.py b/tests/postgres_tests/migrations/0001_setup_extensions.py index 5064f7ff99..3775295f25 100644 --- a/tests/postgres_tests/migrations/0001_setup_extensions.py +++ b/tests/postgres_tests/migrations/0001_setup_extensions.py @@ -1,6 +1,6 @@ from unittest import mock -from django.db import migrations +from django.db import connection, migrations try: from django.contrib.postgres.operations import ( @@ -14,10 +14,12 @@ except ImportError: BtreeGistExtension = mock.Mock() CITextExtension = mock.Mock() CreateExtension = mock.Mock() - CryptoExtension = mock.Mock() HStoreExtension = mock.Mock() TrigramExtension = mock.Mock() UnaccentExtension = mock.Mock() + needs_crypto_extension = False +else: + needs_crypto_extension = not connection.features.is_postgresql_13 class Migration(migrations.Migration): @@ -30,7 +32,8 @@ class Migration(migrations.Migration): # Ensure CreateExtension quotes extension names by creating one with a # dash in its name. CreateExtension('uuid-ossp'), - CryptoExtension(), + # CryptoExtension is required for RandomUUID() on PostgreSQL < 13. + CryptoExtension() if needs_crypto_extension else mock.Mock(), HStoreExtension(), TrigramExtension(), UnaccentExtension(),