数据库迁移操作

所有这些 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 操作失败。