数据库迁移操作¶
所有这些 操作 都可以通过 django.contrib.postgres.operations
模块使用。
使用迁移创建扩展¶
您可以使用迁移文件在数据库中创建 PostgreSQL 扩展。此示例创建了一个 hstore 扩展,但其他扩展也适用相同的原理。
在第一个涉及 HStoreField
的 CreateModel
或 AddField
操作之前,通过添加包含 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
¶
BloomExtension
¶
BtreeGinExtension
¶
BtreeGistExtension
¶
CITextExtension
¶
CryptoExtension
¶
HStoreExtension
¶
TrigramExtension
¶
UnaccentExtension
¶
使用迁移管理排序规则¶
如果您需要使用操作系统提供的但 PostgreSQL 未提供的特定排序规则来过滤或排序列,则可以使用迁移文件在数据库中管理排序规则。然后,这些排序规则可以与 CharField
、TextField
及其子类上的 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,
),
...,
]
并发索引操作¶
PostgreSQL 支持 CREATE INDEX
和 DROP 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
,但避免对现有行验证约束。
注意
AddConstraintNotValid
和 ValidateConstraint
操作应在两个单独的迁移中执行。在同一原子迁移中执行这两个操作的效果与 AddConstraint
相同,而在单个非原子迁移中执行它们可能会使您的数据库处于不一致状态,如果 ValidateConstraint
操作失败。