# Django 5.0.9.dev20240806133106 ドキュメント

# データベースのマイグレーション・オペレーション

これらの マイグレーションオペレーション は全て `django.contrib.postgres.operations` モジュールから利用できます。

## マイグレーションを使って拡張機能を作成する

マイグレーションファイルを使用して、データベースにPostgreSQL拡張を作成できます。この例ではhstore拡張を作成しますが、他の拡張にも同じ原則が適用されます。

`HStoreField` を使用する最初の `CreateModel` または `AddField` オペレーションの前に、PostgreSQL で hstore 拡張機能を設定するために、 `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)

  PostgreSQL拡張モジュールをインストールする `Operation` サブクラスです。一般的な拡張モジュールについては、以下のサブクラスのいずれかを使用してください。

  `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` 拡張機能をインストールします。

## マイグレーションを使って照合順序 (collation) を管理する

OSでは提供されているが 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,
            ),
            ...,
        ]

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では、`CREATE INDEX` と `DROP INDEX` 文の `CONCURRENTLY` オプションをサポートしており、書き込みをロックせずにインデックスを追加したり削除したりすることができます。このオプションは、稼働中のデータベースでインデックスを追加したり削除したりする場合に便利です。

class `AddIndexConcurrently`(model_name, index)

  `AddIndex` と似ていますが、`CONCURRENTLY` オプションを使用してインデックスを作成します。このオプションを使用する際に注意すべきいくつかの注意事項があります。このオプションの使用に関する詳細は、PostgreSQL の indexes concurrently をビルドするためのドキュメント を参照してください。

class `RemoveIndexConcurrently`(model_name, name)

  `RemoveIndex` と似ていますが、`CONCURRENTLY` オプションを使用してインデックスを削除します。このオプションを使用する際に留意すべきいくつかの注意点があります。詳細は、PostgreSQLのドキュメント を参照してください。

注釈

`CONCURRENTLY` オプションはトランザクション内でサポートされていません (詳細は non-atomic migration を参照してください)。

## 検証を強制しない制約を追加する

PostgreSQL は `NOT VALID` オプションを `ADD CONSTRAINT` 文でサポートしており、既存の行の検証を行わずに検査制約を追加できます。このオプションは、既存のすべての行が制約を満たすかどうかを確認するためにテーブルをスキャンする手間を省きたい場合に便利です。

`NOT VALID` オプションで作成されたチェック制約を後から検証するには、 `ValidateConstraint` 操作を使用してください。

詳細については、PostgreSQL のドキュメント を参照してください。

class `AddConstraintNotValid`(model_name, constraint)

  `AddConstraint` に似ていますが、既存の行に対して制約を検証しないものです。

class `ValidateConstraint`(model_name, name)

  テーブルをスキャンし、既存の行にある指定のチェック制約を検証します。

注釈

`AddConstraintNotValid` と `ValidateConstraint` のオペレーションは、2 つの別々のマイグレーションで実行する必要があります。同じアトミック マイグレーション内で両方の操作を実行すると `AddConstraint` クラスと同じ効果があります。一方、非アトミック マイグレーション内で操作を行うと、`ValidateConstraint` 操作が失敗した場合にデータベースが不整合の状態になる可能性があります。