Операции миграции базы данных
Все эти операции доступны из модуля django.contrib.postgres.operations.
Создание расширений PostgreSQL с помощью миграций
Вы можете создать расширение PostgreSQL в вашей базе данных с помощью файла миграции. Этот пример создаёт расширение hstore, но те же принципы применимы и к другим расширениям.
Настройте расширение hstore в PostgreSQL до первой CreateModel или AddField операции, связанной с HStoreField, добавив миграцию с операцией HStoreExtension. Например:
from django.contrib.postgres.operations import HStoreExtension
class Migration(migrations.Migration):
...
operations = [
HStoreExtension(),
...
]
Операция пропускает добавление расширения, если оно уже существует.
Для большинства расширений это требует пользователя базы данных с привилегиями суперпользователя. Если у пользователя Django базы данных нет соответствующих привилегий, вам придётся создать расширение вне миграций Django с пользователем, имеющим их. В этом случае подключитесь к вашей базе данных Django и выполните запрос CREATE EXTENSION IF NOT EXISTS hstore;.
В более старых версиях существование расширения не проверялось.
CreateExtension
-
class CreateExtension(name) -
Подкласс
Operation, который устанавливает расширение PostgreSQL. Для распространённых расширений используйте один из более специфичных подклассов ниже.-
name -
Это обязательный аргумент. Имя расширения, которое необходимо установить.
-
BloomExtension
-
class BloomExtension -
Устанавливает расширение
bloom.
BtreeGinExtension
-
class BtreeGinExtension -
Устанавливает расширение
btree_gin.
BtreeGistExtension
-
class BtreeGistExtension -
Устанавливает расширение
btree_gist.
CITextExtension
-
class CITextExtension -
Устанавливает расширение
citext.
CryptoExtension
-
class CryptoExtension -
Устанавливает расширение
pgcrypto.
HStoreExtension
-
class HStoreExtension -
Устанавливает расширение
hstoreи также настраивает подключение для интерпретации данных hstore для возможного использования в последующих миграциях.
TrigramExtension
-
class TrigramExtension -
Устанавливает расширение
pg_trgm.
UnaccentExtension
-
class UnaccentExtension -
Устанавливает расширение
unaccent.
Управление сортировками PostgreSQL с помощью миграций
Если вам нужно отфильтровать или отсортировать столбец с использованием определённой сортировки, которую предоставляет ваша операционная система, но PostgreSQL не поддерживает, вы можете управлять сортировками в своей базе данных с помощью файла миграции. Эти сортировки затем могут быть использованы с параметром db_collation в CharField, TextField и их подклассах.
Например, для создания сортировки для немецкого телефонного справочника:
from django.contrib.postgres.operations import CreateCollation
class Migration(migrations.Migration):
...
operations = [
CreateCollation(
'german_phonebook',
provider='icu',
locale='und-u-ks-level2',
),
...
]
-
class CreateCollation(name, locale, *, provider='libc', deterministic=True) -
Создаёт сортировку с заданными
name,localeиprovider.Установите параметр
deterministicв значениеFalse, чтобы создать недетерминированную сортировку, например, для фильтрации без учёта регистра.
-
class RemoveCollation(name, locale, *, provider='libc', deterministic=True) -
Удаляет сортировки с именем
name.При обращении это создаёт сортировку с предоставленными
locale,provider, иdeterministicаргументами. Поэтомуlocaleтребуется, чтобы сделать эту операцию обратимой.
Ограничения
Недетерминированные сортировки поддерживаются только в PostgreSQL 12 и выше.
Конкурентные операции с индексами
PostgreSQL поддерживает опцию CONCURRENTLY для CREATE INDEX и DROP INDEX операторов для добавления и удаления индексов без блокировки записей. Эта опция полезна для добавления или удаления индекса в рабочей базе данных.
-
class AddIndexConcurrently(model_name, index) -
Аналогично
AddIndex, но создаёт индекс с опциейCONCURRENTLY. Есть несколько нюансов, о которых следует помнить при использовании этой опции, см. документацию PostgreSQL по созданию индексов параллельно.
-
class RemoveIndexConcurrently(model_name, name) -
Аналогично
RemoveIndex, но удаляет индекс с опциейCONCURRENTLY. Есть несколько нюансов, о которых следует помнить при использовании этой опции, см. документацию PostgreSQL.
Примечание
Опция CONCURRENTLY не поддерживается внутри транзакции (см. неатомарные миграции).
Добавление ограничений без принудительной проверки
PostgreSQL поддерживает опцию NOT VALID с оператором ADD CONSTRAINT для добавления проверочных ограничений без проверки валидации существующих строк. Эта опция полезна, если вы хотите пропустить потенциально длительный проход по таблице для проверки того, что все существующие строки удовлетворяют ограничению.
Для проверки проверочных ограничений, созданных с помощью опции NOT VALID в дальнейшем, используйте операцию ValidateConstraint.
См. документацию PostgreSQL для получения более подробной информации.
-
class AddConstraintNotValid(model_name, constraint) -
Аналогично
AddConstraint, но избегает проверки ограничения на существующих строках.
-
class ValidateConstraint(model_name, name) -
Проходит по таблице и проверяет заданное проверочное ограничение на существующих строках.
Примечание
Операции AddConstraintNotValid и ValidateConstraint должны выполняться в двух отдельных миграциях. Выполнение обеих операций в одной атомарной миграции имеет тот же эффект, что и AddConstraint, а выполнение их в одной неатомарной миграции может оставить вашу базу данных в несогласованном состоянии, если операция ValidateConstraint завершится неудачно.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.0/ref/contrib/postgres/operations/