数据库迁移操作¶
所有这些 操作 都可以从 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
¶
使用迁移来管理整理¶
如果你需要使用你的操作系统提供的特定字节序来过滤或排序一个列,但 PostgreSQL 没有提供,你可以使用迁移文件来管理数据库中的字节序。然后,这些字节序可以在 CharField
、TextField
以及它们的子类上使用 db_collation
参数。
例如,为德国电话簿的排序创建一个字节序:
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)¶ 用给定的
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 支持 CREATE INDEX
和 DROP INDEX
语句中的 CONCURRENTLY
选项,以增加和删除索引而不锁定写入。这个选项对于在实际生产的数据库中添加或删除索引非常有用。
-
class
AddIndexConcurrently
(model_name, index)¶ 就像
AddIndex
一样,但是使用CONCURRENTLY
选项创建索引。这在使用这个选项时有一些注意事项,参见 PostgreSQL 关于并发建立索引的文档 。
-
class
RemoveIndexConcurrently
(model_name, name)¶ 就像
RemoveIndex
一样,但是使用CONCURRENTLY
选项来删除索引。这在使用这个选项时有一些注意事项,请看 PostgreSQL 文档 。
注解
在事务中不支持 CONCURRENTLY
选项(见 非原子性迁移)。