Операции по миграции базы данных¶
Все эти 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
[исходный код]¶ - New in Django 3.1.
Устанавливает расширение
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 9.6 поддерживает только провайдер 'libc'
.
Недетерминированные колляции поддерживаются только в 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).