Операции по миграции базы данных

Все эти 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;.

Changed in Django 3.2:

В старых версиях предварительное существование расширения не проверяется.

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.

Управление коллациями с помощью миграций

New in Django 3.2.

Если вам нужно отфильтровать или упорядочить столбец, используя определенную коллизию, которую предоставляет ваша операционная система, но не предоставляет 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).

Добавление ограничений без принудительной валидации

New in Django 4.0.

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 завершится неудачей.

Вернуться на верх