数据库迁移操作

所有这些 operations 可从 django.contrib.postgres.operations 模块。

使用迁移创建扩展

可以使用迁移文件在数据库中创建PostgreSQL扩展。这个例子创建了一个hstore扩展,但同样的原则也适用于其他扩展。

在PostgreSQL中设置第一个 CreateModelAddField 涉及的操作 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不提供,则可以使用迁移文件管理数据库中的排序规则。这些排序规则然后可以与 db_collation 参数对 CharFieldTextField ,及其子类。

例如,要创建德语电话簿订购的排序规则::

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)[源代码]

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

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

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

指定命名的排序规则 name

反之亦然,这就是用所提供的创建排序规则 localeprovider ,以及 deterministic 争论。因此, locale 需要使此操作可逆。

并发索引操作

PostgreSQL支持 CONCURRENTLY 选项以 CREATE INDEXDROP 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)[源代码]

扫描表并验证现有行上的给定CHECK约束。

备注

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