---
title: "数据库迁移操作"
version: 3.1
locale: zh-hans
source: https://docs.djangoproject.com/zh-hans/3.1/ref/contrib/postgres/operations/
canonical: https://djangodocs.dev/zh-hans/3.1/ref/contrib/postgres/operations/
---
# 数据库迁移操作

所有这些 [操作](/zh-hans/3.1/ref/migration-operations/) 都可以从 `django.contrib.postgres.operations` 模块中获得。

## 使用迁移创建扩展

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

在涉及到 [`HStoreField`](/zh-hans/3.1/ref/contrib/postgres/fields/#django.contrib.postgres.fields.HStoreField) 的第一个 `CreateModel` 或 `AddField` 操作之前，通过添加 [`HStoreExtension`](#django.contrib.postgres.operations.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)`

一个安装 PostgreSQL 扩展的 `Operation` 子类。对于普通的扩展，请使用下面一个更具体的子类。

#### `name`

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

## `BloomExtension`

#### `class BloomExtension`

> **New in Django 3.1**

安装 `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` 扩展。

## 并发索引操作

> **New in Django 3.0**

PostgreSQL 支持 `CREATE INDEX` 和 `DROP INDEX` 语句中的 `CONCURRENTLY` 选项，以增加和删除索引而不锁定写入。这个选项对于在实际生产的数据库中添加或删除索引非常有用。

#### `class AddIndexConcurrently(model_name, index)`

就像 [`AddIndex`](/zh-hans/3.1/ref/migration-operations/#django.db.migrations.operations.AddIndex) 一样，但是使用 `CONCURRENTLY` 选项创建索引。这在使用这个选项时有一些注意事项，参见 [PostgreSQL 关于并发建立索引的文档](https://www.postgresql.org/docs/current/sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY) 。

#### `class RemoveIndexConcurrently(model_name, name)`

就像 [`RemoveIndex`](/zh-hans/3.1/ref/migration-operations/#django.db.migrations.operations.RemoveIndex) 一样，但是使用 `CONCURRENTLY` 选项来删除索引。这在使用这个选项时有一些注意事项，请看 [PostgreSQL 文档](https://www.postgresql.org/docs/current/sql-dropindex.html) 。

> **Note**
>
> 在事务中不支持 `CONCURRENTLY` 选项（见 [非原子性迁移](/zh-hans/3.1/howto/writing-migrations/#non-atomic-migrations)）。
