Операции по миграции базы данных¶
Все эти operations доступны из модуля django.contrib.postgres.operations
.
Создание расширения с помощью миграций¶
Вы можете создать расширение PostgreSQL в своей базе данных с помощью файла миграции. В данном примере создается расширение hstore, но те же принципы применимы и к другим расширениям.
Настройте расширение hstore в PostgreSQL перед первой операцией CreateModel
или AddField
, которая включает HStoreField
, добавив миграцию с операцией HStoreExtension
. Например:
from django.contrib.postgres.operations import HStoreExtension
class Migration(migrations.Migration):
...
operations = [
HStoreExtension(),
...
]
Операция пропускает добавление расширения, если оно уже существует.
Для большинства расширений это требует пользователя базы данных с привилегиями суперпользователя. Если пользователь базы данных Django не имеет соответствующих привилегий, вам придется создать расширение вне Django migrations с пользователем, у которого они есть. В этом случае подключитесь к вашей базе данных 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, вы можете управлять коллизиями в вашей базе данных с помощью файла миграции. Затем эти колляции можно использовать с параметром 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)[исходный код]¶ Создает collation с заданными
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
. При использовании этой опции есть несколько оговорок, о которых следует знать, см. the PostgreSQL documentation of building indexes concurrently.
-
class
RemoveIndexConcurrently
(model_name, name)[исходный код]¶ Как
RemoveIndex
, но удаляет индекс с опциейCONCURRENTLY
. При использовании этой опции есть несколько предостережений, о которых следует знать, см. the PostgreSQL documentation.
Примечание
Опция CONCURRENTLY
не поддерживается внутри транзакции (см. non-atomic migration).
Добавление ограничений без принудительной валидации¶
PostgreSQL поддерживает опцию NOT VALID
с оператором ADD CONSTRAINT
для добавления проверочных ограничений без принудительной проверки существующих строк. Эта опция полезна, если вы хотите пропустить потенциально длительное сканирование таблицы для проверки того, что все существующие строки удовлетворяют ограничению.
Для проверки контрольных ограничений, созданных с помощью опции NOT VALID
в более поздний момент времени, используйте операцию ValidateConstraint
.
Более подробную информацию см. в разделе the PostgreSQL documentation.
-
class
AddConstraintNotValid
(model_name, constraint)[исходный код]¶ Аналогично
AddConstraint
, но позволяет избежать проверки ограничения на существующих строках.
-
class
ValidateConstraint
(model_name, name)[исходный код]¶ Сканирует таблицу и проверяет заданное проверочное ограничение на существующих строках.
Примечание
Операции AddConstraintNotValid
и ValidateConstraint
должны выполняться в двух отдельных миграциях. Выполнение обеих операций в одной атомарной миграции имеет тот же эффект, что и AddConstraint
, тогда как выполнение их в одной неатомарной миграции может оставить вашу базу данных в противоречивом состоянии, если операция ValidateConstraint
завершится неудачей.