数据库迁移操作

所有这些 操作 都可以通过 django.contrib.postgres.operations 模块使用。

使用迁移创建扩展

您可以使用迁移文件在数据库中创建 PostgreSQL 扩展。此示例创建了一个 hstore 扩展,但其他扩展也适用相同的原理。

在第一个涉及 HStoreFieldCreateModelAddField 操作之前,通过添加包含 HStoreExtension 操作的迁移来设置 PostgreSQL 中的 hstore 扩展。例如

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)[source]

一个 Operation 子类,用于安装 PostgreSQL 扩展。对于常用扩展,请使用下面更具体的子类。

name

这是一个必需的参数。要安装的扩展的名称。

BloomExtension

class BloomExtension[source]

安装 bloom 扩展。

BtreeGinExtension

class BtreeGinExtension[source]

安装 btree_gin 扩展。

BtreeGistExtension

class BtreeGistExtension[source]

安装 btree_gist 扩展。

CITextExtension

class CITextExtension[source]

安装 citext 扩展。

CryptoExtension

class CryptoExtension[source]

安装 pgcrypto 扩展。

HStoreExtension

class HStoreExtension[source]

安装 hstore 扩展,并设置连接以解释 hstore 数据,以便在后续迁移中使用。

TrigramExtension

class TrigramExtension[source]

安装 pg_trgm 扩展。

UnaccentExtension

class UnaccentExtension[source]

安装 unaccent 扩展。

使用迁移管理排序规则

如果您需要使用操作系统提供的但 PostgreSQL 未提供的特定排序规则来过滤或排序列,则可以使用迁移文件在数据库中管理排序规则。然后,这些排序规则可以与 CharFieldTextField 及其子类上的 db_collation 参数一起使用。

例如,要为德语电话簿排序创建排序规则

from django.contrib.postgres.operations import CreateCollation


class Migration(migrations.Migration):
    ...

    operations = [
        CreateCollation(
            "case_insensitive",
            provider="icu",
            locale="und-u-ks-level2",
            deterministic=False,
        ),
        ...,
    ]
class CreateCollation(name, locale, *, provider='libc', deterministic=True)[source]

使用给定的 namelocaleprovider 创建排序规则。

deterministic 参数设置为 False 以创建非确定性排序规则,例如用于不区分大小写的过滤。

class RemoveCollation(name, locale, *, provider='libc', deterministic=True)[source]

删除名为 name 的排序规则。

反转时,这是使用提供的 localeproviderdeterministic 参数创建排序规则。因此,locale 是必需的,才能使此操作可逆。

并发索引操作

PostgreSQL 支持 CREATE INDEXDROP INDEX 语句的 CONCURRENTLY 选项,以便在不锁定写入的情况下添加和删除索引。此选项可用于在实时生产数据库中添加或删除索引。

class AddIndexConcurrently(model_name, index)[source]

类似于 AddIndex,但使用 CONCURRENTLY 选项创建索引。使用此选项时需要注意一些事项,请参阅 PostgreSQL 并发构建索引的文档

class RemoveIndexConcurrently(model_name, name)[source]

类似于 RemoveIndex,但使用 CONCURRENTLY 选项删除索引。使用此选项时需要注意一些事项,请参阅 PostgreSQL 文档

注意

CONCURRENTLY 选项在事务内不受支持(请参阅 非原子迁移)。

在添加约束时不强制验证

PostgreSQL 支持 NOT VALID 选项与 ADD CONSTRAINT 语句一起使用,以在不强制对现有行进行验证的情况下添加检查约束。如果您想跳过可能很长的表扫描以验证所有现有行是否满足约束,此选项很有用。

要在稍后时间点验证使用 NOT VALID 选项创建的检查约束,请使用 ValidateConstraint 操作。

请参阅 PostgreSQL 文档 以获取更多详细信息。

class AddConstraintNotValid(model_name, constraint)[source]

类似于 AddConstraint,但避免对现有行验证约束。

class ValidateConstraint(model_name, name)[source]

扫描整个表并验证给定检查约束对现有行的有效性。

注意

AddConstraintNotValidValidateConstraint 操作应在两个单独的迁移中执行。在同一原子迁移中执行这两个操作的效果与 AddConstraint 相同,而在单个非原子迁移中执行它们可能会使您的数据库处于不一致状态,如果 ValidateConstraint 操作失败。

返回顶部