{"title":"マイグレーション・オペレーション","version":"5.1","locale":"ja","docname":"ref/migration-operations","url":"/ja/5.1/ref/migration-operations/","canonical":"https://djangodocs.dev/ja/5.1/ref/migration-operations/","summary":"マイグレーションファイルは一つ以上の オペレーション 、データベースに対してマイグレーションが行うべきオペレーションを宣言的に保持するオブジェクト、から構成されます。 Django はこれらの Operation…","html":"<span id=\"migration-operations\"></span><h1>マイグレーション・オペレーション<a class=\"heading-anchor\" href=\"#module-django.db.migrations.operations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>マイグレーションファイルは一つ以上の <code class=\"docutils literal notranslate\"><span class=\"pre\">オペレーション</span></code>、データベースに対してマイグレーションが行うべきオペレーションを宣言的に保持するオブジェクト、から構成されます。</p>\n<p>Django はこれらの <code class=\"docutils literal notranslate\"><span class=\"pre\">Operation</span></code> オブジェクトも使用して、モデルの履歴を確認し、前回のマイグレーション以降にモデルに加えた変更を計算します。そのため、自動的にマイグレーションを書き出すことができます。マイグレーションの定義が宣言的なのはそのためであり、Django がそれらを簡単にメモリに読み込んで、データベースに触れることなくプロジェクトがどのようにあるべきかを把握するために実行することができます。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.1/topics/migrations/#data-migrations\"><span class=\"std std-ref\">データのマイグレーション</span></a> や高度なデータベースへの手動操作のような特別な <code class=\"docutils literal notranslate\"><span class=\"pre\">オペレーション</span></code> も存在します。もし頻繁に行われる独自の変更をカプセル化したければ独自に <code class=\"docutils literal notranslate\"><span class=\"pre\">オペレーション</span></code> を記述する事もできます。</p>\n<p>もし独自の <code class=\"docutils literal notranslate\"><span class=\"pre\">Operation</span></code> オブジェクトを定義する空のマイグレーションファイルが必要であれば、<code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">makemigrations</span> <span class=\"pre\">--empty</span> <span class=\"pre\">yourappname</span></code> を実行してください。ただし、手動でのスキーマ変更オペレーションの追加はマイグレーションの自動検出機構を混乱させ、 <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a> が正しい結果を出力しなくなる可能性があることに十分注意してください。</p>\n<p>Django が提供するコア機能は全て <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.migrations.operations</span></code> モジュールから利用できます。</p>\n<p>より入門的な内容に関しては、 <a class=\"reference internal\" href=\"/ja/5.1/topics/migrations/\"><span class=\"doc\">トピックスのマイグレーション</span></a> を参照ください。</p>\n<section id=\"schema-operations\">\n<h2>スキーマ・オペレーション<a class=\"heading-anchor\" href=\"#schema-operations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"createmodel\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">CreateModel</span></code><a class=\"heading-anchor\" href=\"#createmodel\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.CreateModel\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">CreateModel</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fields</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">options</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">bases</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">managers</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.CreateModel\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>プロジェクトの履歴に新たなモデル、そしてデータベース上に対応するテーブルを作成します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code> ファイルに定義されているであろうモデルの名称です。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">(フィールド名,</span> <span class=\"pre\">フィールドのインスタンス)</span></code> という 2 値のタプルのリストです。フィールドのインスタンスは束縛されないフィールド(他のモデルから取得した物でなく、単に <code class=\"docutils literal notranslate\"><span class=\"pre\">models.CharField(...)</span></code> 等と記述する物)でなければいけません。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">options</span></code> は定義されるモデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> クラスの値からなるオプションの辞書オブジェクトです。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">bases</span></code> はオプションで、このモデルに継承させる他のクラスのリストです。（すでに定義した他のモデルを継承する場合、）クラスオブジェクトまたは <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;appname.ModelName&quot;</span></code> という形式の文字列を含めることができます。このパラメータが空の場合、デフォルトでは標準の <code class=\"docutils literal notranslate\"><span class=\"pre\">models.Model</span></code> から継承します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">managers</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">(マネージャ名,</span> <span class=\"pre\">マネージャのインスタンス)</span></code> という 2 値のタプルのリストを受け取ります。マイグレーションの間はリスト内で最初に定義されたマネージャがこのモデルの標準マネージャとして利用されます。</p>\n</section>\n<section id=\"deletemodel\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">DeleteModel</span></code><a class=\"heading-anchor\" href=\"#deletemodel\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.DeleteModel\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">DeleteModel</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.DeleteModel\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>プロジェクトの履歴からモデルを、加えてデータベースから該当モデルを扱うテーブルを削除します。</p>\n</section>\n<section id=\"renamemodel\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RenameModel</span></code><a class=\"heading-anchor\" href=\"#renamemodel\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RenameModel\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RenameModel</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RenameModel\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>モデルの名称を今までの名称から新しい名称に変更します。</p>\n<p>一度に定義しているモデルの名前とかなり多くのフィールドの名前を変更した場合は手動でこの処理を追加する必要があるかもしれません;マイグレーションの自動検知機構が古い名称を持ったモデルを削除して異なった名称のモデルを追加したと認識してしまうため、そのマイグレーション処理は古いテーブルの全てのデータを消去してしまいます。</p>\n</section>\n<section id=\"altermodeltable\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterModelTable</span></code><a class=\"heading-anchor\" href=\"#altermodeltable\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.AlterModelTable\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AlterModelTable</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">table</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterModelTable\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>定義しているモデルのテーブル名を変更します(<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> サブクラスの <a class=\"reference internal\" href=\"/ja/5.1/ref/models/options/#django.db.models.Options.db_table\" title=\"django.db.models.Options.db_table\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_table</span></code></a> オプションを参照します)。</p>\n</section>\n<section id=\"altermodeltablecomment\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterModelTableComment</span></code><a class=\"heading-anchor\" href=\"#altermodeltablecomment\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.AlterModelTableComment\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AlterModelTableComment</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">table_comment</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterModelTableComment\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>モデルのテーブルコメント (<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> サブクラスの <a class=\"reference internal\" href=\"/ja/5.1/ref/models/options/#django.db.models.Options.db_table_comment\" title=\"django.db.models.Options.db_table_comment\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_table_comment</span></code></a> オプション) を変更します。</p>\n</section>\n<section id=\"alteruniquetogether\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterUniqueTogether</span></code><a class=\"heading-anchor\" href=\"#alteruniquetogether\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.AlterUniqueTogether\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AlterUniqueTogether</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">unique_together</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterUniqueTogether\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>モデルのユニーク制約のセットを変更します (<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> サブクラスの <a class=\"reference internal\" href=\"/ja/5.1/ref/models/options/#django.db.models.Options.unique_together\" title=\"django.db.models.Options.unique_together\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique_together</span></code></a> オプション)。</p>\n</section>\n<section id=\"alterindextogether\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterIndexTogether</span></code><a class=\"heading-anchor\" href=\"#alterindextogether\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.AlterIndexTogether\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AlterIndexTogether</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">index_together</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterIndexTogether\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>モデルのカスタムインデックスのセットを変更します (<code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> サブクラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">index_together</span></code> オプション)。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterIndexTogether</span></code> は公式には Django 4.2 以前のマイグレーションファイルにのみサポートされています。後方互換性の理由から、これはまだパブリック API の一部であり、非推奨または削除する予定はありませんが、新しいマイグレーションには使わないでください。代わりに <a class=\"reference internal\" href=\"#django.db.migrations.operations.AddIndex\" title=\"django.db.migrations.operations.AddIndex\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AddIndex</span></code></a> と <a class=\"reference internal\" href=\"#django.db.migrations.operations.RemoveIndex\" title=\"django.db.migrations.operations.RemoveIndex\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoveIndex</span></code></a> オペレーションを使ってください。</p>\n</aside>\n</section>\n<section id=\"alterorderwithrespectto\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterOrderWithRespectTo</span></code><a class=\"heading-anchor\" href=\"#alterorderwithrespectto\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.AlterOrderWithRespectTo\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AlterOrderWithRespectTo</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">order_with_respect_to</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterOrderWithRespectTo\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> サブクラスの <a class=\"reference internal\" href=\"/ja/5.1/ref/models/options/#django.db.models.Options.order_with_respect_to\" title=\"django.db.models.Options.order_with_respect_to\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">order_with_respect_to</span></code></a> オプションに必要な <code class=\"docutils literal notranslate\"><span class=\"pre\">_order</span></code> カラムを作成または削除します。</p>\n</section>\n<section id=\"altermodeloptions\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterModelOptions</span></code><a class=\"heading-anchor\" href=\"#altermodeloptions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.AlterModelOptions\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AlterModelOptions</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">options</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterModelOptions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code> のような雑多なモデルオプション（モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> の設定）の変更を保存します。データベースには影響を与えませんが、 <a class=\"reference internal\" href=\"#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RunPython</span></code></a> インスタンスが使用するためにこれらの変更を保持します。 <code class=\"docutils literal notranslate\"><span class=\"pre\">options</span></code> はオプション名と値をマッピングした辞書である必要があります。</p>\n</section>\n<section id=\"altermodelmanagers\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterModelManagers</span></code><a class=\"heading-anchor\" href=\"#altermodelmanagers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.AlterModelManagers\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AlterModelManagers</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">managers</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterModelManagers\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>マイグレーション中に利用可能なマネージャを変更します。</p>\n</section>\n<section id=\"addfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AddField</span></code><a class=\"heading-anchor\" href=\"#addfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.AddField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AddField</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">preserve_default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AddField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>モデルにフィールドを追加します。 <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> はモデル名、 <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> はフィールド名、 <code class=\"docutils literal notranslate\"><span class=\"pre\">field</span></code> はバインドされていないフィールドのインスタンスです。これは <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code> のフィールド宣言に記述します。たとえば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">models.IntegerField(null=True)</span></code> のように書きます。</p>\n<p>引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">preserve_default</span></code> は、フィールドのデフォルト値が永続的で、プロジェクトの状態に焼き込むべきもの (<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>) か、それとも一時的で今回のマイグレーションのためのもの (<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>) かを示します。通常、マイグレーションはテーブルに NULL 値でないフィールドを追加するため、既存の行に入れるデフォルト値が必要なためです。Django がデータベースのデフォルトを設定することはなく、常に Django ORM コードの中でデフォルトを適用します。これは、データベースにデフォルトを直接設定する動作には影響しません。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>古いデータベースでは、デフォルト値を持つフィールドを追加すると、テーブルの完全な書き換えが発生することがあります。これはNULL可能なフィールドでも発生し、パフォーマンスに悪影響を及ぼす可能性があります。これを避けるには、以下の手順を実行する必要があります。</p>\n<ul class=\"simple\">\n<li><p>デフォルト値なしで nullable フィールドを追加し、 <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a> コマンドを実行します。これで <code class=\"docutils literal notranslate\"><span class=\"pre\">AddField</span></code> オペレーションを持つマイグレーションが生成されるはずです。</p></li>\n<li><p>デフォルト値をフィールドに追加し、 <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a> コマンドを実行します。これで <code class=\"docutils literal notranslate\"><span class=\"pre\">AlterField</span></code> オペレーションを持つマイグレーションが生成されるはずです。</p></li>\n</ul>\n</aside>\n</section>\n<section id=\"removefield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RemoveField</span></code><a class=\"heading-anchor\" href=\"#removefield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RemoveField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RemoveField</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RemoveField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>モデルからフィールドを削除します。</p>\n<p>逆の場合、これは実際にはモデルにフィールドを追加していることに留意してください。フィールドが null 許容であるか、再作成されたカラムに入力するために使われるデフォルト値を持っている場合、この操作は可逆です（データの損失を除けば不可逆です）。フィールドが null 許容でなく、デフォルト値を持たない場合、この操作は不可逆です。</p>\n<aside class=\"admonition-postgresql admonition\">\n<p class=\"admonition-title\">PostgreSQL</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">RemoveField</span></code> は、削除されたフィールドに関連する追加のデータベースオブジェクト（たとえばビューなど）も削除します。これは、テーブル外の依存オブジェクトも確実に削除されるようにするために（参照: <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-PARMS-CASCADE\">dependent objects outside the table are also dropped</a> ）、生成される <code class=\"docutils literal notranslate\"><span class=\"pre\">DROP</span> <span class=\"pre\">COLUMN</span></code> ステートメントは <code class=\"docutils literal notranslate\"><span class=\"pre\">CASCADE</span></code> 句を含むからです。</p>\n</aside>\n</section>\n<section id=\"alterfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AlterField</span></code><a class=\"heading-anchor\" href=\"#alterfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.AlterField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AlterField</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">preserve_default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AlterField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>フィールドの型を変更したり、 <a class=\"reference internal\" href=\"/ja/5.1/ref/models/fields/#django.db.models.Field.null\" title=\"django.db.models.Field.null\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">null</span></code></a>, <a class=\"reference internal\" href=\"/ja/5.1/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique</span></code></a>, <a class=\"reference internal\" href=\"/ja/5.1/ref/models/fields/#django.db.models.Field.db_column\" title=\"django.db.models.Field.db_column\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_column</span></code></a> などのフィールド属性を変更したりします。</p>\n<p>引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">preserve_default</span></code> は、フィールドのデフォルト値が永続的で、プロジェクトの状態に保持されるべきもの (<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>) か、それとも一時的でこのマイグレーションのためだけのもの (<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>) かを指定します。通常マイグレーションは null 許容のフィールドを null 非許容のフィールドに変更し、既存の行に入れるデフォルト値が必要だからです。Django がデータベースのデフォルトを設定することはなく、常に Django ORM コードの中でデフォルトを適用します。</p>\n<p>たとえば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">models.TextField()</span></code> のようなテキスト型のフィールドを <code class=\"docutils literal notranslate\"><span class=\"pre\">models.IntegerField()</span></code> のような数値型のフィールドに変更することは、ほとんどのデータベースではできません。</p>\n</section>\n<section id=\"renamefield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RenameField</span></code><a class=\"heading-anchor\" href=\"#renamefield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RenameField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RenameField</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RenameField\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>フィールドの名前を変更します(また、 <a class=\"reference internal\" href=\"/ja/5.1/ref/models/fields/#django.db.models.Field.db_column\" title=\"django.db.models.Field.db_column\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_column</span></code></a> が指定されていない限り、カラム名も変更します)。</p>\n</section>\n<section id=\"addindex\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AddIndex</span></code><a class=\"heading-anchor\" href=\"#addindex\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.AddIndex\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AddIndex</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">index</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AddIndex\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>データベーステーブルに <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> のモデルのインデックスを作成します。 <code class=\"docutils literal notranslate\"><span class=\"pre\">index</span></code> は <a class=\"reference internal\" href=\"/ja/5.1/ref/models/indexes/#django.db.models.Index\" title=\"django.db.models.Index\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Index</span></code></a> クラスのインスタンスです。</p>\n</section>\n<section id=\"removeindex\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RemoveIndex</span></code><a class=\"heading-anchor\" href=\"#removeindex\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RemoveIndex\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RemoveIndex</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RemoveIndex\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> のモデルから <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> という名前のインデックスを削除します。</p>\n</section>\n<section id=\"renameindex\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RenameIndex</span></code><a class=\"heading-anchor\" href=\"#renameindex\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RenameIndex\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RenameIndex</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">new_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_fields</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RenameIndex\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>モデルの <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> に対するデータベーステーブルのインデックスの名前を変更します。 <code class=\"docutils literal notranslate\"><span class=\"pre\">old_name</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">old_fields</span></code> のいずれか一方のみを提供できます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">old_fields</span></code> は文字列のイテラブルで、通常は <code class=\"docutils literal notranslate\"><span class=\"pre\">index_together</span></code> （Django 5.1以前のオプション）のフィールドに対応します。</p>\n<p>インデックス名の変更文をサポートしていないデータベース（SQLiteとMariaDB &lt; 10.5.2）では、この操作はインデックスを削除して再作成することになり、コストがかかります。</p>\n</section>\n<section id=\"addconstraint\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">AddConstraint</span></code><a class=\"heading-anchor\" href=\"#addconstraint\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.AddConstraint\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AddConstraint</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">constraint</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.AddConstraint\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>データベーステーブルの <code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> のモデルに <a class=\"reference internal\" href=\"/ja/5.1/ref/models/constraints/\"><span class=\"doc\">制約</span></a> を作成します。</p>\n</section>\n<section id=\"removeconstraint\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RemoveConstraint</span></code><a class=\"heading-anchor\" href=\"#removeconstraint\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RemoveConstraint\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RemoveConstraint</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">model_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RemoveConstraint\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> のモデルから <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> という名前の制約を削除します。</p>\n</section>\n</section>\n<section id=\"special-operations\">\n<h2>特別なオペレーション<a class=\"heading-anchor\" href=\"#special-operations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"runsql\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RunSQL</span></code><a class=\"heading-anchor\" href=\"#runsql\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RunSQL\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RunSQL</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">sql</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">reverse_sql</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">state_operations</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">hints</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">elidable</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RunSQL\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>データベース上で任意の SQL を実行できるようにします。Django が直接サポートしていない、データベースバックエンドのより高度な機能に便利です。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_sql</span></code> があれば、データベースで実行する SQL の文字列を指定します。ほとんどのデータベースバックエンド (PostgreSQL 以外) では、 Django は SQL を実行する前に個々の文に分割します。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>PostgreSQL と SQLite では、Django のトランザクション状態を壊さないように、 <a class=\"reference internal\" href=\"/ja/5.1/howto/writing-migrations/#non-atomic-migrations\"><span class=\"std std-ref\">ノンアトミックなマイグレーション</span></a> の SQL で <code class=\"docutils literal notranslate\"><span class=\"pre\">BEGIN</span></code> か <code class=\"docutils literal notranslate\"><span class=\"pre\">COMMIT</span></code> だけを使ってください。</p>\n</aside>\n<p>文字列もしくは 2 値のタプルのリストを渡すことができます。その内後者はクエリとパラメータを <a class=\"reference internal\" href=\"/ja/5.1/topics/db/sql/#executing-custom-sql\"><span class=\"std std-ref\">cursor.execute()</span></a> において行うのと同じ形式で渡すために用いられます。以下の 3 つの処理は互いに等価です:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunSQL</span><span class=\"p\">(</span><span class=\"s2\">&quot;INSERT INTO musician (name) VALUES (&#39;Reinhardt&#39;);&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunSQL</span><span class=\"p\">([(</span><span class=\"s2\">&quot;INSERT INTO musician (name) VALUES (&#39;Reinhardt&#39;);&quot;</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">)])</span>\n<span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunSQL</span><span class=\"p\">([(</span><span class=\"s2\">&quot;INSERT INTO musician (name) VALUES (</span><span class=\"si\">%s</span><span class=\"s2\">);&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;Reinhardt&quot;</span><span class=\"p\">])])</span>\n</code></pre></div>\n<p>クエリにパーセント文字リテラルを含ませたい場合、パラメータを渡していればパーセント文字を二重に記述する必要があります。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_sql</span></code> クエリはマイグレーションを元に戻す際に実行されます。これらのクエリは <code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code> クエリで実行された内容を元に戻します。たとえば、上記の挿入を削除で取り消す場合:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunSQL</span><span class=\"p\">(</span>\n    <span class=\"n\">sql</span><span class=\"o\">=</span><span class=\"p\">[(</span><span class=\"s2\">&quot;INSERT INTO musician (name) VALUES (</span><span class=\"si\">%s</span><span class=\"s2\">);&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;Reinhardt&quot;</span><span class=\"p\">])],</span>\n    <span class=\"n\">reverse_sql</span><span class=\"o\">=</span><span class=\"p\">[(</span><span class=\"s2\">&quot;DELETE FROM musician where name=</span><span class=\"si\">%s</span><span class=\"s2\">;&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;Reinhardt&quot;</span><span class=\"p\">])],</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_sql</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (デフォルト) の場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">RunSQL</span></code> オペレーションは元に戻りません。</p>\n<p>引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">state_operations</span></code> にはプロジェクトのステートから見た SQL と等価となる処理を渡すことができます。たとえば、手動でカラムを作成した場合、マイグレーションの自動検知機構が最新のモデルのステートを保持できるように <code class=\"docutils literal notranslate\"><span class=\"pre\">AddField</span></code> のリストを渡す必要があります。そうしなければ、次に <code class=\"docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code> を実行した際、フィールドを追加した処理を一切検知せずに同じ追加処理を再度適用してしまうでしょう。次に例を示します。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunSQL</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;ALTER TABLE musician ADD COLUMN name varchar(255) NOT NULL;&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">state_operations</span><span class=\"o\">=</span><span class=\"p\">[</span>\n        <span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">AddField</span><span class=\"p\">(</span>\n            <span class=\"s2\">&quot;musician&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span>\n            <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">255</span><span class=\"p\">),</span>\n        <span class=\"p\">),</span>\n    <span class=\"p\">],</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>オプションの <code class=\"docutils literal notranslate\"><span class=\"pre\">hints</span></code> 引数はデータベースルータオブジェクトの <a class=\"reference internal\" href=\"/ja/5.1/topics/db/multi-db/#allow_migrate\" title=\"allow_migrate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">allow_migrate()</span></code></a> メソッドに <code class=\"docutils literal notranslate\"><span class=\"pre\">**hints</span></code> として渡されてルーティングの決定を補助します。データベースのヒントに関しての詳細は <a class=\"reference internal\" href=\"/ja/5.1/topics/db/multi-db/#topics-db-multi-db-hints\"><span class=\"std std-ref\">ヒント</span></a> を参照ください。</p>\n<p>オプションの <code class=\"docutils literal notranslate\"><span class=\"pre\">elidable</span></code> 引数はこの処理を <a class=\"reference internal\" href=\"/ja/5.1/topics/migrations/#migration-squashing\"><span class=\"std std-ref\">マイグレーションのスカッシュ</span></a> を行った際に消去する(省略する)か否かを決定します。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RunSQL.noop\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">RunSQL.</span></span><span class=\"sig-name descname\"><span class=\"pre\">noop</span></span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RunSQL.noop\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>指定された順序での処理を行わない場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code> もしくは <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_sql</span></code> に対して <code class=\"docutils literal notranslate\"><span class=\"pre\">RunSQL.noop</span></code> 要素を渡します。これは特に処理を逆の順序で行いたい場合に有用です。</p>\n</dd></dl>\n\n</section>\n<section id=\"runpython\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code><a class=\"heading-anchor\" href=\"#runpython\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RunPython\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RunPython</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">code</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">reverse_code</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">atomic</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">hints</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">elidable</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RunPython\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>マイグレーション履歴を反映して独自の Python コードを実行します。<code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code> (与えられれば加えて <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_code</span></code> )は二つの引数を受け取る呼び出し可能オブジェクトでなければなりません;第一引数はプロジェクトの履歴において処理の場所が一致している履歴を反映したモデルを含んだ <code class=\"docutils literal notranslate\"><span class=\"pre\">django.apps.registry.Apps</span></code> のインスタンスであり、第二引数は <a class=\"reference internal\" href=\"/ja/5.1/ref/schema-editor/#django.db.backends.base.schema.BaseDatabaseSchemaEditor\" title=\"django.db.backends.base.schema.BaseDatabaseSchemaEditor\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SchemaEditor</span></code></a> のインスタンスです。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_code</span></code> 引数はマイグレーションを元に戻す際に呼び出されます。この呼び出し可能オブジェクトはマイグレーションが逆順処理可能となるよう、先の呼び出し可能オブジェクト <code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code> で行われた処理を無効化しなければなりません。 <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_code</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> (デフォルト) の場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> オペレーションは元に戻りません。</p>\n<p>オプションの <code class=\"docutils literal notranslate\"><span class=\"pre\">hints</span></code> 引数はルーティングの決定を補助するためにデータベースルータの <a class=\"reference internal\" href=\"/ja/5.1/topics/db/multi-db/#allow_migrate\" title=\"allow_migrate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">allow_migrate()</span></code></a> メソッドに <code class=\"docutils literal notranslate\"><span class=\"pre\">**hints</span></code> として渡されます。データベースのヒントに関しての詳細は <a class=\"reference internal\" href=\"/ja/5.1/topics/db/multi-db/#topics-db-multi-db-hints\"><span class=\"std std-ref\">ヒント</span></a> を参照してください。</p>\n<p>オプションの <code class=\"docutils literal notranslate\"><span class=\"pre\">elidable</span></code> 引数はこの処理を <a class=\"reference internal\" href=\"/ja/5.1/topics/migrations/#migration-squashing\"><span class=\"std std-ref\">マイグレーションのスカッシュ</span></a> を行った際に消去する(省略する)か否かを決定します。</p>\n<p>マイグレーションファイルの <code class=\"docutils literal notranslate\"><span class=\"pre\">Migration</span></code> クラスから独立した別の関数として記述し、 <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> に渡すことを推奨します。以下に <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> を用いて <code class=\"docutils literal notranslate\"><span class=\"pre\">Country</span></code> モデル上の初期オブジェクトを追加する例を示します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">migrations</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">forwards_func</span><span class=\"p\">(</span><span class=\"n\">apps</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">):</span>\n    <span class=\"c1\"># We get the model from the versioned app registry;</span>\n    <span class=\"c1\"># if we directly import it, it&#39;ll be the wrong version</span>\n    <span class=\"n\">Country</span> <span class=\"o\">=</span> <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">get_model</span><span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Country&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">db_alias</span> <span class=\"o\">=</span> <span class=\"n\">schema_editor</span><span class=\"o\">.</span><span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">alias</span>\n    <span class=\"n\">Country</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"n\">db_alias</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">bulk_create</span><span class=\"p\">(</span>\n        <span class=\"p\">[</span>\n            <span class=\"n\">Country</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;USA&quot;</span><span class=\"p\">,</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;us&quot;</span><span class=\"p\">),</span>\n            <span class=\"n\">Country</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;France&quot;</span><span class=\"p\">,</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;fr&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">]</span>\n    <span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">reverse_func</span><span class=\"p\">(</span><span class=\"n\">apps</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">):</span>\n    <span class=\"c1\"># forwards_func() creates two Country instances,</span>\n    <span class=\"c1\"># so reverse_func() should delete them.</span>\n    <span class=\"n\">Country</span> <span class=\"o\">=</span> <span class=\"n\">apps</span><span class=\"o\">.</span><span class=\"n\">get_model</span><span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Country&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">db_alias</span> <span class=\"o\">=</span> <span class=\"n\">schema_editor</span><span class=\"o\">.</span><span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">alias</span>\n    <span class=\"n\">Country</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"n\">db_alias</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;USA&quot;</span><span class=\"p\">,</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;us&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n    <span class=\"n\">Country</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">using</span><span class=\"p\">(</span><span class=\"n\">db_alias</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;France&quot;</span><span class=\"p\">,</span> <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s2\">&quot;fr&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Migration</span><span class=\"p\">(</span><span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">Migration</span><span class=\"p\">):</span>\n    <span class=\"n\">dependencies</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n    <span class=\"n\">operations</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"n\">migrations</span><span class=\"o\">.</span><span class=\"n\">RunPython</span><span class=\"p\">(</span><span class=\"n\">forwards_func</span><span class=\"p\">,</span> <span class=\"n\">reverse_func</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>これは <a class=\"reference internal\" href=\"/ja/5.1/topics/migrations/#data-migrations\"><span class=\"std std-ref\">データのマイグレーション</span></a> の作成、独自のデータ更新と構成変更、そして ORM や Python のコードにアクセスを必要とするあらゆるオペレーションのために行われる一般的なオペレーションです。</p>\n<p><a class=\"reference internal\" href=\"#django.db.migrations.operations.RunSQL\" title=\"django.db.migrations.operations.RunSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RunSQL</span></code></a> と同様、もし内部のスキーマを変更する場合は Django のモデル機構のスコープ範囲外 (たとえば triggers など) で行うか、もしくはモデルの状態に変更を反映する処理に <a class=\"reference internal\" href=\"#django.db.migrations.operations.SeparateDatabaseAndState\" title=\"django.db.migrations.operations.SeparateDatabaseAndState\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SeparateDatabaseAndState</span></code></a> を追加する事を心がけてください。そうでなければ、バージョン管理された ORM およびマイグレーションの自動検出機構が正常に動作しなくなってしまいます。</p>\n<p>標準では <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> は DDL トランザクションをサポートしないデータベース (たとえば MySQL と Oracle など) 上では通常のトランザクション内で記述された内容の処理を行います。この仕組みは安全ではありますが、これらのデータベースバックエンドを利用中に <code class=\"docutils literal notranslate\"><span class=\"pre\">schema_editor</span></code> を利用しようとするとクラッシュを引き起こす場合があります。このような場合は、<code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> に対して <code class=\"docutils literal notranslate\"><span class=\"pre\">atomic=False</span></code> を渡してください。</p>\n<p>トランザクション中の DDL 使用をサポートしているデータベース(SQLite や PostgreSQL)においては、<code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> は各マイグレーションに対して作成されたトランザクション以外に自動的にトランザクションを保持しません。そのため、たとえば PostgreSQL では、スキーマ変更と <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> を同一のマイグレーション内で結合させて用いるのは避けるべきであり、そうしなければ <code class=\"docutils literal notranslate\"><span class=\"pre\">OperationalError:</span> <span class=\"pre\">cannot</span> <span class=\"pre\">ALTER</span> <span class=\"pre\">TABLE</span> <span class=\"pre\">&quot;mytable&quot;</span> <span class=\"pre\">because</span> <span class=\"pre\">it</span> <span class=\"pre\">has</span> <span class=\"pre\">pending</span> <span class=\"pre\">trigger</span> <span class=\"pre\">events</span></code> のようなエラーに遭遇する可能性があります。</p>\n<p>もしここまでに挙げられた物と異なるデータベースを利用しておりトランザクション中の DDL 事項をサポートしているか不明な場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connection.features.can_rollback_ddl</span></code> 属性を確認してください。</p>\n<p>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> オペレーションが <a class=\"reference internal\" href=\"/ja/5.1/howto/writing-migrations/#non-atomic-migrations\"><span class=\"std std-ref\">非アトミックなマイグレーション</span></a> の一部である場合、そのオペレーションは <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> オペレーションに対して <code class=\"docutils literal notranslate\"><span class=\"pre\">atomic=True</span></code> が渡されて生成されたトランザクション中においてのみ実行されます。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython</span></code> はモデルのデータベース接続を魔法のように切り替える事はしません;データベースのエイリアス(作成した関数の第二引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">schema_editor</span></code> 内、 <code class=\"docutils literal notranslate\"><span class=\"pre\">schema_editor.connection.alias</span></code> から利用可能)を指定していないモデルのメソッドはすべてデフォルトのデータベースを利用します。</p>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.RunPython.noop\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">static</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">RunPython.</span></span><span class=\"sig-name descname\"><span class=\"pre\">noop</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.RunPython.noop\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>指定された順序で処理を行いたくない場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">code</span></code> もしくは <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse_code</span></code> に <code class=\"docutils literal notranslate\"><span class=\"pre\">RunPython.noop</span></code> メソッドを渡してください。この指定は処理を逆順で行いたい場合に特に有用です。</p>\n</dd></dl>\n\n</section>\n<section id=\"separatedatabaseandstate\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">SeparateDatabaseAndState</span></code><a class=\"heading-anchor\" href=\"#separatedatabaseandstate\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.SeparateDatabaseAndState\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">SeparateDatabaseAndState</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">database_operations</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">state_operations</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.SeparateDatabaseAndState\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>データベース(スキーマ変更)と状態(自動検出機能)という2つの側面を混在させてマッチさせることができる、高度に専門化されたオペレーションです。</p>\n<p>これは2つのオペレーションのリストを受け入れます。状態への適用を求められたときは、 <code class=\"docutils literal notranslate\"><span class=\"pre\">state_operations</span></code> リストを使用します(これは <a class=\"reference internal\" href=\"#django.db.migrations.operations.RunSQL\" title=\"django.db.migrations.operations.RunSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RunSQL</span></code></a> の <code class=\"docutils literal notranslate\"><span class=\"pre\">state_operations</span></code> 引数の一般化されたバージョンです)。データベースへの変更の適用を求められたときは、 <code class=\"docutils literal notranslate\"><span class=\"pre\">database_operations</span></code> リストを使用します。</p>\n<p>データベースの実際の状態と Django の状態のビューが同期しなくなると、マイグレーションフレームワークが壊れてしまい、データが失われることさえあります。じっくりと、データベースと状態のオペレーションを慎重にチェックすべきです。データベースのオペレーションをチェックするために、 <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">sqlmigrate</span></code></a> と <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-dbshell\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">dbshell</span></code></a> を使うことができます。状態のオペレーションをチェックするために <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a> 、特に <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#cmdoption-makemigrations-dry-run\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--dry-run</span></code></a> を使うことができます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SeparateDatabaseAndState</span></code> の使用例は、 <a class=\"reference internal\" href=\"/ja/5.1/howto/writing-migrations/#changing-a-manytomanyfield-to-use-a-through-model\"><span class=\"std std-ref\">ManyToManyField を中間 (through) モデルを使うように変更する</span></a> を参照してください。</p>\n</section>\n</section>\n<section id=\"operation-category\">\n<h2>オペレーション・カテゴリ<a class=\"heading-anchor\" href=\"#operation-category\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"version-note version-added\" data-version=\"5.1\">\n<p class=\"version-note-title\">New in Django 5.1</p></aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.base.OperationCategory\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">OperationCategory</span></span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.base.OperationCategory\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemigrations</span></code></a> コマンドで意味のある記号を表示するために使用される、マイグレーションオペレーションのカテゴリ。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.base.OperationCategory.ADDITION\">\n<span class=\"sig-name descname\"><span class=\"pre\">ADDITION</span></span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.base.OperationCategory.ADDITION\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>記号</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">+</span></code></p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.base.OperationCategory.REMOVAL\">\n<span class=\"sig-name descname\"><span class=\"pre\">REMOVAL</span></span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.base.OperationCategory.REMOVAL\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>記号</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">-</span></code></p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.base.OperationCategory.ALTERATION\">\n<span class=\"sig-name descname\"><span class=\"pre\">ALTERATION</span></span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.base.OperationCategory.ALTERATION\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>記号</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">~</span></code></p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.base.OperationCategory.PYTHON\">\n<span class=\"sig-name descname\"><span class=\"pre\">PYTHON</span></span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.base.OperationCategory.PYTHON\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>記号</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">p</span></code></p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.base.OperationCategory.SQL\">\n<span class=\"sig-name descname\"><span class=\"pre\">SQL</span></span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.base.OperationCategory.SQL\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>記号</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">s</span></code></p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.migrations.operations.base.OperationCategory.MIXED\">\n<span class=\"sig-name descname\"><span class=\"pre\">MIXED</span></span><a class=\"heading-anchor\" href=\"#django.db.migrations.operations.base.OperationCategory.MIXED\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>記号</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">?</span></code></p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"writing-your-own\">\n<span id=\"writing-your-own-migration-operation\"></span><h2>独自のオペレーションを書く<a class=\"heading-anchor\" href=\"#writing-your-own\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>オペレーションは比較的シンプルな API を持っており、Django に内蔵された機能を独自に補助する処理を簡単に記述できるよう設計されています。<code class=\"docutils literal notranslate\"><span class=\"pre\">Operation</span></code> の基本構造は以下のようなものです:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.migrations.operations.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Operation</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyCustomOperation</span><span class=\"p\">(</span><span class=\"n\">Operation</span><span class=\"p\">):</span>\n    <span class=\"c1\"># If this is False, it means that this operation will be ignored by</span>\n    <span class=\"c1\"># sqlmigrate; if true, it will be run and the SQL collected for its output.</span>\n    <span class=\"n\">reduces_to_sql</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n\n    <span class=\"c1\"># If this is False, Django will refuse to reverse past this operation.</span>\n    <span class=\"n\">reversible</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n\n    <span class=\"c1\"># This categorizes the operation. The corresponding symbol will be</span>\n    <span class=\"c1\"># displayed by the makemigrations command.</span>\n    <span class=\"n\">category</span> <span class=\"o\">=</span> <span class=\"n\">OperationCategory</span><span class=\"o\">.</span><span class=\"n\">ADDITION</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">arg1</span><span class=\"p\">,</span> <span class=\"n\">arg2</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Operations are usually instantiated with arguments in migration</span>\n        <span class=\"c1\"># files. Store the values of them on self for later use.</span>\n        <span class=\"k\">pass</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">state_forwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">state</span><span class=\"p\">):</span>\n        <span class=\"c1\"># The Operation should take the &#39;state&#39; parameter (an instance of</span>\n        <span class=\"c1\"># django.db.migrations.state.ProjectState) and mutate it to match</span>\n        <span class=\"c1\"># any schema changes that have occurred.</span>\n        <span class=\"k\">pass</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">database_forwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">,</span> <span class=\"n\">from_state</span><span class=\"p\">,</span> <span class=\"n\">to_state</span><span class=\"p\">):</span>\n        <span class=\"c1\"># The Operation should use schema_editor to apply any changes it</span>\n        <span class=\"c1\"># wants to make to the database.</span>\n        <span class=\"k\">pass</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">database_backwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">,</span> <span class=\"n\">from_state</span><span class=\"p\">,</span> <span class=\"n\">to_state</span><span class=\"p\">):</span>\n        <span class=\"c1\"># If reversible is True, this is called when the operation is reversed.</span>\n        <span class=\"k\">pass</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">describe</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># This is used to describe what the operation does.</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;Custom Operation&quot;</span>\n\n    <span class=\"nd\">@property</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">migration_name_fragment</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Optional. A filename part suitable for automatically naming a</span>\n        <span class=\"c1\"># migration containing this operation, or None if not applicable.</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;custom_operation_</span><span class=\"si\">%s</span><span class=\"s2\">_</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">arg1</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">arg2</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>上の例もテンプレートとして利用できますが、 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.migrations.operations</span></code> 内の Django 組み込みのオペレーションを参考にすることをお勧めします。これらは <code class=\"docutils literal notranslate\"><span class=\"pre\">ProjectState</span></code> や履歴上のモデルを取得するために使用されるパターン、 <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelState</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">state_forwards()</span></code> で履歴上のモデルを模倣するために使用されるパターンなど、マイグレーションフレームワークの半内部的な側面の使用例を多くカバーしています。</p>\n<p>いくつかの注意すべき点</p>\n<ul>\n<li><p>マイグレーションを記述するのに <code class=\"docutils literal notranslate\"><span class=\"pre\">ProjectState</span></code> について多くを学ぶ必要はありません。ただし、それがアプリケーションの登録情報へのアクセスを提供するプロパティ <code class=\"docutils literal notranslate\"><span class=\"pre\">app</span></code> を持っていることだけは知っていて下さい。それに対して <code class=\"docutils literal notranslate\"><span class=\"pre\">get_model</span></code> を呼ぶことで取得できます。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">database_forwards</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">database_backwards</span></code> はどちらもパラメータとして 2 つの状態を受け取ります。これらは <code class=\"docutils literal notranslate\"><span class=\"pre\">state_forwards</span></code> メソッドが適用するであろう差分を表していますが、利便性と実行速度のために渡されます。</p></li>\n<li><p>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">database_forwards()</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">database_backwards()</span></code> の <code class=\"docutils literal notranslate\"><span class=\"pre\">from_state</span></code> 引数からモデルクラスやモデルインスタンスを操作したい場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">clear_delayed_apps_cache()</span></code> メソッドを使ってモデルの状態をレンダリングし、リレーション先モデルを利用できるようにする必要があります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">database_forwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">,</span> <span class=\"n\">from_state</span><span class=\"p\">,</span> <span class=\"n\">to_state</span><span class=\"p\">):</span>\n    <span class=\"c1\"># This operation should have access to all models. Ensure that all models are</span>\n    <span class=\"c1\"># reloaded in case any are delayed.</span>\n    <span class=\"n\">from_state</span><span class=\"o\">.</span><span class=\"n\">clear_delayed_apps_cache</span><span class=\"p\">()</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</li>\n<li><p>database_backwards メソッドにおける <code class=\"docutils literal notranslate\"><span class=\"pre\">to_state</span></code> は <em>古い</em> 状態を示します;そのため、その値はマイグレーションが状態を戻した場合は現在の状態となります。</p></li>\n<li><p>内蔵されたオペレーションにおいて <code class=\"docutils literal notranslate\"><span class=\"pre\">references_model</span></code> が実装されているのを見つけるかもしれません;これは独自のオペレーションのためでなく自動検知機構のコードの一部として存在しています。</p></li>\n</ul>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>パフォーマンス上の理由から、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelState.fields</span></code> 内の <a class=\"reference internal\" href=\"/ja/5.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> のインスタンスはマイグレーション間で再利用されます。これらのインスタンスの属性を決して変更してはいけません。<code class=\"docutils literal notranslate\"><span class=\"pre\">state_forwards()</span></code> 内のフィールドを変更したい場合は、<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelState.fields</span></code> から古いインスタンスを削除して新たなインスタンスと置き換える必要があります。<code class=\"docutils literal notranslate\"><span class=\"pre\">ModelState.managers</span></code> 内の <a class=\"reference internal\" href=\"/ja/5.1/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Manager</span></code></a> のインスタンスについても同様です。</p>\n</aside>\n<p>簡単な例として、(PostgreSQL のよりエキサイティングな機能を含んだ) PostgreSQL 拡張をロードするオペレーションを作成してみましょう。これはモデルの状態を変えず、1 つのコマンドを実行します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.migrations.operations.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Operation</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">LoadExtension</span><span class=\"p\">(</span><span class=\"n\">Operation</span><span class=\"p\">):</span>\n    <span class=\"n\">reversible</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">name</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">state_forwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">state</span><span class=\"p\">):</span>\n        <span class=\"k\">pass</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">database_forwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">,</span> <span class=\"n\">from_state</span><span class=\"p\">,</span> <span class=\"n\">to_state</span><span class=\"p\">):</span>\n        <span class=\"n\">schema_editor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;CREATE EXTENSION IF NOT EXISTS </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">database_backwards</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">schema_editor</span><span class=\"p\">,</span> <span class=\"n\">from_state</span><span class=\"p\">,</span> <span class=\"n\">to_state</span><span class=\"p\">):</span>\n        <span class=\"n\">schema_editor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;DROP EXTENSION </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">describe</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;Creates extension </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span>\n\n    <span class=\"nd\">@property</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">migration_name_fragment</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;create_extension_</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span>\n</code></pre></div>\n</section>","rootId":"module-django.db.migrations.operations","toc":[{"title":"スキーマ・オペレーション","anchor":"schema-operations","children":[{"title":"CreateModel","anchor":"createmodel","children":[]},{"title":"DeleteModel","anchor":"deletemodel","children":[]},{"title":"RenameModel","anchor":"renamemodel","children":[]},{"title":"AlterModelTable","anchor":"altermodeltable","children":[]},{"title":"AlterModelTableComment","anchor":"altermodeltablecomment","children":[]},{"title":"AlterUniqueTogether","anchor":"alteruniquetogether","children":[]},{"title":"AlterIndexTogether","anchor":"alterindextogether","children":[]},{"title":"AlterOrderWithRespectTo","anchor":"alterorderwithrespectto","children":[]},{"title":"AlterModelOptions","anchor":"altermodeloptions","children":[]},{"title":"AlterModelManagers","anchor":"altermodelmanagers","children":[]},{"title":"AddField","anchor":"addfield","children":[]},{"title":"RemoveField","anchor":"removefield","children":[]},{"title":"AlterField","anchor":"alterfield","children":[]},{"title":"RenameField","anchor":"renamefield","children":[]},{"title":"AddIndex","anchor":"addindex","children":[]},{"title":"RemoveIndex","anchor":"removeindex","children":[]},{"title":"RenameIndex","anchor":"renameindex","children":[]},{"title":"AddConstraint","anchor":"addconstraint","children":[]},{"title":"RemoveConstraint","anchor":"removeconstraint","children":[]}]},{"title":"特別なオペレーション","anchor":"special-operations","children":[{"title":"RunSQL","anchor":"runsql","children":[]},{"title":"RunPython","anchor":"runpython","children":[]},{"title":"SeparateDatabaseAndState","anchor":"separatedatabaseandstate","children":[]}]},{"title":"オペレーション・カテゴリ","anchor":"operation-category","children":[]},{"title":"独自のオペレーションを書く","anchor":"writing-your-own","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API リファレンス","url":"/ja/5.1/ref/"}],"prev":{"docname":"ref/middleware","title":"ミドルウェア","url":"/ja/5.1/ref/middleware/"},"next":{"docname":"ref/models/index","title":"モデル","url":"/ja/5.1/ref/models/"},"formats":{"html":"/ja/5.1/ref/migration-operations/","markdown":"/ja/5.1/ref/migration-operations.md","json":"/ja/5.1/ref/migration-operations.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/ref/migration-operations.txt","official":"https://docs.djangoproject.com/ja/5.1/ref/migration-operations/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}