{"title":"データベースのマイグレーションの作成方法","version":"6.0","locale":"ja","docname":"howto/writing-migrations","url":"/ja/6.0/howto/writing-migrations/","canonical":"https://djangodocs.dev/ja/6.0/howto/writing-migrations/","summary":"このドキュメントでは、遭遇する可能性のあるいくつかのシナリオに対する、データベースのマイグレーションの構成方法と書き方について説明します。","html":"<h1>データベースのマイグレーションの作成方法<a class=\"heading-anchor\" href=\"#how-to-create-database-migrations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>このドキュメントでは、遭遇する可能性のあるいくつかのシナリオに対する、データベースのマイグレーションの構成方法と書き方について説明します。マイグレーションに関する入門的な資料を探しているなら、<a class=\"reference internal\" href=\"/ja/6.0/topics/migrations/\"><span class=\"doc\">トピック別ガイド</span></a> を読んでください。</p>\n<section id=\"data-migrations-and-multiple-databases\">\n<span id=\"id1\"></span><h2>データのマイグレーションと複数のデータベース<a class=\"heading-anchor\" href=\"#data-migrations-and-multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>複数のデータベースを使用している場合、特定のデータベースに対してマイグレーションを実行するかどうかを判断する必要があるかもしれません。例えば、特定のデータベースに対してのみマイグレーションを実行したい場合です。</p>\n<p>これを行うには、 <code class=\"docutils literal notranslate\">RunPython</code> 操作の中で、 <code class=\"docutils literal notranslate\">schema_editor.connection.alias</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=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations\n\n\n<span class=\"k\">def</span> <span class=\"nf\">forwards</span><span class=\"p\">(</span>apps<span class=\"p\">,</span> schema_editor<span class=\"p\">):</span>\n    <span class=\"k\">if</span> schema_editor<span class=\"o\">.</span>connection<span class=\"o\">.</span>alias <span class=\"o\">!=</span> <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span>\n    <span class=\"c1\"># Your migration code goes here</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"c1\"># Dependencies to other migrations</span>\n    <span class=\"p\">]</span>\n\n    operations <span class=\"o\">=</span> <span class=\"p\">[</span>\n        migrations<span class=\"o\">.</span>RunPython<span class=\"p\">(</span>forwards<span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>You can also provide hints that will be passed to the <a class=\"reference internal\" href=\"/ja/6.0/topics/db/multi-db/#allow_migrate\" title=\"allow_migrate\"><code class=\"xref py py-meth docutils literal notranslate\">allow_migrate()</code></a>\nmethod of database routers as <code class=\"docutils literal notranslate\">**hints</code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">myapp/dbrouters.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyRouter</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span> <span class=\"nf\">allow_migrate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db<span class=\"p\">,</span> app_label<span class=\"p\">,</span> model_name<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"s2\">&quot;target_db&quot;</span> <span class=\"ow\">in</span> hints<span class=\"p\">:</span>\n            <span class=\"k\">return</span> db <span class=\"o\">==</span> hints<span class=\"p\">[</span><span class=\"s2\">&quot;target_db&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> <span class=\"kc\">True</span>\n</code></pre></figure>\n<p>これをマイグレーションに利用するには、次のようにします:</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=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations\n\n\n<span class=\"k\">def</span> <span class=\"nf\">forwards</span><span class=\"p\">(</span>apps<span class=\"p\">,</span> schema_editor<span class=\"p\">):</span>\n    <span class=\"c1\"># Your migration code goes here</span>\n    <span class=\"o\">...</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"c1\"># Dependencies to other migrations</span>\n    <span class=\"p\">]</span>\n\n    operations <span class=\"o\">=</span> <span class=\"p\">[</span>\n        migrations<span class=\"o\">.</span>RunPython<span class=\"p\">(</span>forwards<span class=\"p\">,</span> hints<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;target_db&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">}),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>もし <code class=\"docutils literal notranslate\">RunPython</code> や <code class=\"docutils literal notranslate\">RunSQL</code> 操作が 1 つのモデルにしか影響しないのであれば、 <code class=\"docutils literal notranslate\">model_name</code> をヒントとして渡すことで、ルーターに対して最大限、透過的になります。これは再利用可能なサードパーティアプリにとって特に重要です。</p>\n</section>\n<section id=\"migrations-that-add-unique-fields\">\n<h2>ユニークなフィールドを追加するマイグレーション<a class=\"heading-anchor\" href=\"#migrations-that-add-unique-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>既存の行を持つテーブルにユニークな非 Null フィールドを追加する「プレーン」なマイグレーションを適用するとエラーが発生します。これは、既存の行すべてを埋めるために使用される値がただ一つだけ生成され、これがユニーク制約に違反するためです。</p>\n<p>そのため、次の手順を踏む必要があります。この例では、デフォルト値を持つ非 Null の <a class=\"reference internal\" href=\"/ja/6.0/ref/models/fields/#django.db.models.UUIDField\" title=\"django.db.models.UUIDField\"><code class=\"xref py py-class docutils literal notranslate\">UUIDField</code></a> を追加します。必要に応じて、該当するフィールドを変更してください。</p>\n<ul>\n<li><p>モデルに <code class=\"docutils literal notranslate\">default=uuid.uuid4</code> と <code class=\"docutils literal notranslate\">unique=True</code> 引数を持つフィールドを追加します（追加するフィールドのタイプに適切なデフォルトを選択してください）。</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/6.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> コマンドを実行します。これにより、 <code class=\"docutils literal notranslate\">AddField</code> 操作を含むマイグレーションが生成されます。</p></li>\n<li><p>同じアプリに対して <code class=\"docutils literal notranslate\">makemigrations myapp --empty</code> を2回実行して、2つの空のマイグレーションファイルを生成します。以下の例では、マイグレーションファイルにわかりやすい名前を付けるためにファイル名を変更しています。</p></li>\n<li><p>自動生成されたマイグレーション(3つの新しいファイルのうちの最初のファイル)から <code class=\"docutils literal notranslate\">AddField</code> オペレーションを最後のマイグレーションにコピーし、 <code class=\"docutils literal notranslate\">AddField</code> を <code class=\"docutils literal notranslate\">AlterField</code> に変更し、 <code class=\"docutils literal notranslate\">uuid</code> と <code class=\"docutils literal notranslate\">models</code> のインポートを追加します。例:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">0006_remove_uuid_null.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"c1\"># Generated by Django A.B on YYYY-MM-DD HH:MM</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations<span class=\"p\">,</span> models\n<span class=\"kn\">import</span> <span class=\"nn\">uuid</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0005_populate_uuid_values&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n\n    operations <span class=\"o\">=</span> <span class=\"p\">[</span>\n        migrations<span class=\"o\">.</span>AlterField<span class=\"p\">(</span>\n            model_name<span class=\"o\">=</span><span class=\"s2\">&quot;mymodel&quot;</span><span class=\"p\">,</span>\n            name<span class=\"o\">=</span><span class=\"s2\">&quot;uuid&quot;</span><span class=\"p\">,</span>\n            field<span class=\"o\">=</span>models<span class=\"o\">.</span>UUIDField<span class=\"p\">(</span>default<span class=\"o\">=</span>uuid<span class=\"o\">.</span>uuid4<span class=\"p\">,</span> unique<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">),</span>\n        <span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></figure>\n</li>\n<li><p>最初の移行ファイルを編集します。 生成された移行クラスは次のようになります:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">0004_add_uuid_field.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0003_auto_20150129_1705&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n\n    operations <span class=\"o\">=</span> <span class=\"p\">[</span>\n        migrations<span class=\"o\">.</span>AddField<span class=\"p\">(</span>\n            model_name<span class=\"o\">=</span><span class=\"s2\">&quot;mymodel&quot;</span><span class=\"p\">,</span>\n            name<span class=\"o\">=</span><span class=\"s2\">&quot;uuid&quot;</span><span class=\"p\">,</span>\n            field<span class=\"o\">=</span>models<span class=\"o\">.</span>UUIDField<span class=\"p\">(</span>default<span class=\"o\">=</span>uuid<span class=\"o\">.</span>uuid4<span class=\"p\">,</span> unique<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">),</span>\n        <span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></figure>\n<p><code class=\"docutils literal notranslate\">unique=True</code> を <code class=\"docutils literal notranslate\">null=True</code> に変更してください。これは、一時的にNULLフィールドを作成し、すべての行に一意な値を設定するまで、一意制約の作成を延期します。</p>\n</li>\n<li><p>最初の空のマイグレーションファイルに、 <a class=\"reference internal\" href=\"/ja/6.0/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a> または <a class=\"reference internal\" href=\"/ja/6.0/ref/migration-operations/#django.db.migrations.operations.RunSQL\" title=\"django.db.migrations.operations.RunSQL\"><code class=\"xref py py-class docutils literal notranslate\">RunSQL</code></a> オペレーションを追加して、既存の各行に対して一意な値 (この例では UUID) を生成します。 <code class=\"docutils literal notranslate\">uuid</code> のインポートも追加します。例:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">0005_populate_uuid_values.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"c1\"># Generated by Django A.B on YYYY-MM-DD HH:MM</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations\n<span class=\"kn\">import</span> <span class=\"nn\">uuid</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">gen_uuid</span><span class=\"p\">(</span>apps<span class=\"p\">,</span> schema_editor<span class=\"p\">):</span>\n    MyModel <span class=\"o\">=</span> apps<span class=\"o\">.</span>get_model<span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;MyModel&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">for</span> row <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">():</span>\n        row<span class=\"o\">.</span>uuid <span class=\"o\">=</span> uuid<span class=\"o\">.</span>uuid4<span class=\"p\">()</span>\n        row<span class=\"o\">.</span>save<span class=\"p\">(</span>update_fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;uuid&quot;</span><span class=\"p\">])</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0004_add_uuid_field&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n\n    operations <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"c1\"># omit reverse_code=... if you don&#39;t want the migration to be reversible.</span>\n        migrations<span class=\"o\">.</span>RunPython<span class=\"p\">(</span>gen_uuid<span class=\"p\">,</span> reverse_code<span class=\"o\">=</span>migrations<span class=\"o\">.</span>RunPython<span class=\"o\">.</span>noop<span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></figure>\n</li>\n<li><p>これで <a class=\"reference internal\" href=\"/ja/6.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> コマンドを使って通常通りマイグレーションを適用することができます。</p>\n<p>このマイグレーションの実行中にオブジェクトの作成を許可すると、競合状態が発生することに注意してください。 <code class=\"docutils literal notranslate\">AddField</code> の後でかつ <code class=\"docutils literal notranslate\">RunPython</code> の前に作成されたオブジェクトは、元の <code class=\"docutils literal notranslate\">uuid</code> が上書きされます。</p>\n</li>\n</ul>\n<section id=\"non-atomic-migrations\">\n<span id=\"id2\"></span><h3>非アトミックのマイグレーション<a class=\"heading-anchor\" href=\"#non-atomic-migrations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>DDL トランザクションをサポートしているデータベース (SQLite と PostgreSQL) では、マイグレーションはデフォルトでトランザクション内で実行されます。大きなテーブルに対してデータ移行を行う場合などには、 <code class=\"docutils literal notranslate\">atomic</code> 属性を <code class=\"docutils literal notranslate\">False</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=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    atomic <span class=\"o\">=</span> <span class=\"kc\">False</span>\n</code></pre></div>\n<p>Within such a migration, all operations are run without a transaction. It's\npossible to execute parts of the migration inside a transaction using\n<a class=\"reference internal\" href=\"/ja/6.0/topics/db/transactions/#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a> or by passing <code class=\"docutils literal notranslate\">atomic=True</code> to\n<code class=\"docutils literal notranslate\">RunPython</code>.</p>\n<p>以下は、大きなテーブルを小さなバッチで更新する、非アトミックなデータマイグレーションの例です:</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\">import</span> <span class=\"nn\">uuid</span>\n\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations<span class=\"p\">,</span> transaction\n\n\n<span class=\"k\">def</span> <span class=\"nf\">gen_uuid</span><span class=\"p\">(</span>apps<span class=\"p\">,</span> schema_editor<span class=\"p\">):</span>\n    MyModel <span class=\"o\">=</span> apps<span class=\"o\">.</span>get_model<span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;MyModel&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">while</span> MyModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>uuid__isnull<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span><span class=\"o\">.</span>exists<span class=\"p\">():</span>\n        <span class=\"k\">with</span> transaction<span class=\"o\">.</span>atomic<span class=\"p\">():</span>\n            <span class=\"k\">for</span> row <span class=\"ow\">in</span> MyModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>uuid__isnull<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)[:</span><span class=\"mi\">1000</span><span class=\"p\">]:</span>\n                row<span class=\"o\">.</span>uuid <span class=\"o\">=</span> uuid<span class=\"o\">.</span>uuid4<span class=\"p\">()</span>\n                row<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    atomic <span class=\"o\">=</span> <span class=\"kc\">False</span>\n\n    operations <span class=\"o\">=</span> <span class=\"p\">[</span>\n        migrations<span class=\"o\">.</span>RunPython<span class=\"p\">(</span>gen_uuid<span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">atomic</code> 属性は DDL トランザクションをサポートしていないデータベース (MySQL や Oracle など) には影響しません。(MySQLの <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/atomic-ddl.html\">atomic DDL statement support</a> は、ロールバック可能なトランザクションに包まれた複数のステートメントではなく、個々のステートメントを指します)。</p>\n</section>\n</section>\n<section id=\"controlling-the-order-of-migrations\">\n<h2>マイグレーションの順序をコントロールする<a class=\"heading-anchor\" href=\"#controlling-the-order-of-migrations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django はマイグレーションを適用する順番を、マイグレーションのファイル名ではなく、 <code class=\"docutils literal notranslate\">Migration</code> クラスの 2 つのプロパティである <code class=\"docutils literal notranslate\">dependencies</code> と <code class=\"docutils literal notranslate\">run_before</code> を使ってグラフを作成することで決定します:</p>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> コマンドを使ったことがあるなら、おそらく <code class=\"docutils literal notranslate\">dependencies</code> の動作をすでに見ているでしょう。自動生成されたマイグレーションは作成プロセスの一部としてそれを定義するためです。</p>\n<p><code class=\"docutils literal notranslate\">dependencies</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=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0123_the_previous_migration&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>通常はこれで十分ですが、時にはあなたのマイグレーションが他のマイグレーションよりも <em>先に</em> 実行されるようにする必要があるかもしれません。これは例えば、サードパーティアプリのマイグレーションを <a class=\"reference internal\" href=\"/ja/6.0/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\">AUTH_USER_MODEL</code></a> の置換の <em>後に</em> 実行させるのに便利です。</p>\n<p>これを行うには、 <code class=\"docutils literal notranslate\">Migration</code> クラスの <code class=\"docutils literal notranslate\">run_before</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\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    run_before <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;third_party_app&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0001_do_awesome&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>可能な限り、 <code class=\"docutils literal notranslate\">run_before</code> よりも <code class=\"docutils literal notranslate\">dependencies</code> を使うことを推奨します。 <code class=\"docutils literal notranslate\">run_before</code> を使うのは、書いているマイグレーションの後に実行したいマイグレーションで <code class=\"docutils literal notranslate\">dependencies</code> を指定するのが望ましくないか、現実的でない場合のみです。</p>\n</section>\n<section id=\"migrating-data-between-third-party-apps\">\n<h2>サードパーティのアプリ間でデータをマイグレーションする<a class=\"heading-anchor\" href=\"#migrating-data-between-third-party-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>データマイグレーションを使って、あるサードパーティアプリケーションから別のアプリケーションにデータを移動できます。</p>\n<p>後で古いアプリを削除する予定がある場合は、古いアプリがインストールされているかどうかに基づいて <code class=\"docutils literal notranslate\">dependencies</code> プロパティを設定する必要があります。そうしないと、古いアプリをアンインストールしたときに依存関係がなくなってしまいます。同様に、古いアプリからモデルを取得する <code class=\"docutils literal notranslate\">apps.get_model()</code> の呼び出しで <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#LookupError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\">LookupError</code></a> をキャッチする必要があります。この方法によって、古いアプリをインストールしてからアンインストールすることなく、プロジェクトをどこにでもデプロイできるようになります。</p>\n<p>簡単なマイグレーションの例を見てみましょう:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">myapp/migrations/0124_move_old_app_to_new_app.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.apps</span> <span class=\"kn\">import</span> apps <span class=\"k\">as</span> global_apps\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations\n\n\n<span class=\"k\">def</span> <span class=\"nf\">forwards</span><span class=\"p\">(</span>apps<span class=\"p\">,</span> schema_editor<span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        OldModel <span class=\"o\">=</span> apps<span class=\"o\">.</span>get_model<span class=\"p\">(</span><span class=\"s2\">&quot;old_app&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;OldModel&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"ne\">LookupError</span><span class=\"p\">:</span>\n        <span class=\"c1\"># The old app isn&#39;t installed.</span>\n        <span class=\"k\">return</span>\n\n    NewModel <span class=\"o\">=</span> apps<span class=\"o\">.</span>get_model<span class=\"p\">(</span><span class=\"s2\">&quot;new_app&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;NewModel&quot;</span><span class=\"p\">)</span>\n    NewModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>bulk_create<span class=\"p\">(</span>\n        NewModel<span class=\"p\">(</span>new_attribute<span class=\"o\">=</span>old_object<span class=\"o\">.</span>old_attribute<span class=\"p\">)</span>\n        <span class=\"k\">for</span> old_object <span class=\"ow\">in</span> OldModel<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n    <span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    operations <span class=\"o\">=</span> <span class=\"p\">[</span>\n        migrations<span class=\"o\">.</span>RunPython<span class=\"p\">(</span>forwards<span class=\"p\">,</span> migrations<span class=\"o\">.</span>RunPython<span class=\"o\">.</span>noop<span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0123_the_previous_migration&quot;</span><span class=\"p\">),</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;new_app&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0001_initial&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n\n    <span class=\"k\">if</span> global_apps<span class=\"o\">.</span>is_installed<span class=\"p\">(</span><span class=\"s2\">&quot;old_app&quot;</span><span class=\"p\">):</span>\n        dependencies<span class=\"o\">.</span>append<span class=\"p\">((</span><span class=\"s2\">&quot;old_app&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0001_initial&quot;</span><span class=\"p\">))</span>\n</code></pre></figure>\n<p>また、マイグレーションが適用されないときにどうしたいかも検討します。（上記の例のように）何もしないか、新しいアプリケーションからデータの一部または全部を削除できます。 それに応じて <a class=\"reference internal\" href=\"/ja/6.0/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-mod docutils literal notranslate\">RunPython</code></a> 操作の2番目の引数を調整します。</p>\n</section>\n<section id=\"changing-a-manytomanyfield-to-use-a-through-model\">\n<span id=\"id3\"></span><h2><code class=\"docutils literal notranslate\">ManyToManyField</code> を中間 (<code class=\"docutils literal notranslate\">through</code>) モデルを使うように変更する<a class=\"heading-anchor\" href=\"#changing-a-manytomanyfield-to-use-a-through-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/6.0/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> を <code class=\"docutils literal notranslate\">through</code> モデルに変更すると、デフォルトのマイグレーションは既存のテーブルを削除して新しいテーブルを作成し、既存のリレーションを失います。これを避けるには、<a class=\"reference internal\" href=\"/ja/6.0/ref/migration-operations/#django.db.migrations.operations.SeparateDatabaseAndState\" title=\"django.db.migrations.operations.SeparateDatabaseAndState\"><code class=\"xref py py-class docutils literal notranslate\">SeparateDatabaseAndState</code></a> を使用して、マイグレーションの自動検出器に新しいモデルが作成されたことを伝えながら、既存のテーブル名を新しいテーブル名に変更します。既存のテーブル名と制約名は <a class=\"reference internal\" href=\"/ja/6.0/ref/django-admin/#django-admin-sqlmigrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">sqlmigrate</code></a> または <a class=\"reference internal\" href=\"/ja/6.0/ref/django-admin/#django-admin-dbshell\"><code class=\"xref std std-djadmin docutils literal notranslate\">dbshell</code></a> で確認できます。新しいテーブル名は中間モデルの <code class=\"docutils literal notranslate\">_meta.db_table</code> プロパティで確認できます。新しい <code class=\"docutils literal notranslate\">through</code> モデルは <code class=\"docutils literal notranslate\">ForeignKey</code> に Django と同じ名前を使うべきです。また、追加のフィールドが必要な場合は、 <a class=\"reference internal\" href=\"/ja/6.0/ref/migration-operations/#django.db.migrations.operations.SeparateDatabaseAndState\" title=\"django.db.migrations.operations.SeparateDatabaseAndState\"><code class=\"xref py py-class docutils literal notranslate\">SeparateDatabaseAndState</code></a> の後の操作で追加してください。</p>\n<p>例えば、 <code class=\"docutils literal notranslate\">Author</code> にリンクする <code class=\"docutils literal notranslate\">ManyToManyField</code> を持つ <code class=\"docutils literal notranslate\">Book</code> モデルがあった場合、次のように新しいフィールド <code class=\"docutils literal notranslate\">is_primary</code> を持つ中間モデル <code class=\"docutils literal notranslate\">AuthorBook</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=\"nn\">django.db</span> <span class=\"kn\">import</span> migrations<span class=\"p\">,</span> models\n<span class=\"kn\">import</span> <span class=\"nn\">django.db.models.deletion</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Migration</span><span class=\"p\">(</span>migrations<span class=\"o\">.</span>Migration<span class=\"p\">):</span>\n    dependencies <span class=\"o\">=</span> <span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;core&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;0001_initial&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n\n    operations <span class=\"o\">=</span> <span class=\"p\">[</span>\n        migrations<span class=\"o\">.</span>SeparateDatabaseAndState<span class=\"p\">(</span>\n            database_operations<span class=\"o\">=</span><span class=\"p\">[</span>\n                <span class=\"c1\"># Old table name from checking with sqlmigrate, new table</span>\n                <span class=\"c1\"># name from AuthorBook._meta.db_table.</span>\n                migrations<span class=\"o\">.</span>RunSQL<span class=\"p\">(</span>\n                    sql<span class=\"o\">=</span><span class=\"s2\">&quot;ALTER TABLE core_book_authors RENAME TO core_authorbook&quot;</span><span class=\"p\">,</span>\n                    reverse_sql<span class=\"o\">=</span><span class=\"s2\">&quot;ALTER TABLE core_authorbook RENAME TO core_book_authors&quot;</span><span class=\"p\">,</span>\n                <span class=\"p\">),</span>\n            <span class=\"p\">],</span>\n            state_operations<span class=\"o\">=</span><span class=\"p\">[</span>\n                migrations<span class=\"o\">.</span>CreateModel<span class=\"p\">(</span>\n                    name<span class=\"o\">=</span><span class=\"s2\">&quot;AuthorBook&quot;</span><span class=\"p\">,</span>\n                    fields<span class=\"o\">=</span><span class=\"p\">[</span>\n                        <span class=\"p\">(</span>\n                            <span class=\"s2\">&quot;id&quot;</span><span class=\"p\">,</span>\n                            models<span class=\"o\">.</span>AutoField<span class=\"p\">(</span>\n                                auto_created<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                                primary_key<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n                                serialize<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span>\n                                verbose_name<span class=\"o\">=</span><span class=\"s2\">&quot;ID&quot;</span><span class=\"p\">,</span>\n                            <span class=\"p\">),</span>\n                        <span class=\"p\">),</span>\n                        <span class=\"p\">(</span>\n                            <span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span>\n                            models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n                                on_delete<span class=\"o\">=</span>django<span class=\"o\">.</span>db<span class=\"o\">.</span>models<span class=\"o\">.</span>deletion<span class=\"o\">.</span>DO_NOTHING<span class=\"p\">,</span>\n                                to<span class=\"o\">=</span><span class=\"s2\">&quot;core.Author&quot;</span><span class=\"p\">,</span>\n                            <span class=\"p\">),</span>\n                        <span class=\"p\">),</span>\n                        <span class=\"p\">(</span>\n                            <span class=\"s2\">&quot;book&quot;</span><span class=\"p\">,</span>\n                            models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n                                on_delete<span class=\"o\">=</span>django<span class=\"o\">.</span>db<span class=\"o\">.</span>models<span class=\"o\">.</span>deletion<span class=\"o\">.</span>DO_NOTHING<span class=\"p\">,</span>\n                                to<span class=\"o\">=</span><span class=\"s2\">&quot;core.Book&quot;</span><span class=\"p\">,</span>\n                            <span class=\"p\">),</span>\n                        <span class=\"p\">),</span>\n                    <span class=\"p\">],</span>\n                    options<span class=\"o\">=</span><span class=\"p\">{</span>\n                        <span class=\"s2\">&quot;constraints&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n                            models<span class=\"o\">.</span>UniqueConstraint<span class=\"p\">(</span>\n                                fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;author&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;book&quot;</span><span class=\"p\">],</span>\n                                name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_author_book&quot;</span><span class=\"p\">,</span>\n                            <span class=\"p\">)</span>\n                        <span class=\"p\">],</span>\n                    <span class=\"p\">},</span>\n                <span class=\"p\">),</span>\n                migrations<span class=\"o\">.</span>AlterField<span class=\"p\">(</span>\n                    model_name<span class=\"o\">=</span><span class=\"s2\">&quot;book&quot;</span><span class=\"p\">,</span>\n                    name<span class=\"o\">=</span><span class=\"s2\">&quot;authors&quot;</span><span class=\"p\">,</span>\n                    field<span class=\"o\">=</span>models<span class=\"o\">.</span>ManyToManyField<span class=\"p\">(</span>\n                        to<span class=\"o\">=</span><span class=\"s2\">&quot;core.Author&quot;</span><span class=\"p\">,</span>\n                        through<span class=\"o\">=</span><span class=\"s2\">&quot;core.AuthorBook&quot;</span><span class=\"p\">,</span>\n                    <span class=\"p\">),</span>\n                <span class=\"p\">),</span>\n            <span class=\"p\">],</span>\n        <span class=\"p\">),</span>\n        migrations<span class=\"o\">.</span>AddField<span class=\"p\">(</span>\n            model_name<span class=\"o\">=</span><span class=\"s2\">&quot;authorbook&quot;</span><span class=\"p\">,</span>\n            name<span class=\"o\">=</span><span class=\"s2\">&quot;is_primary&quot;</span><span class=\"p\">,</span>\n            field<span class=\"o\">=</span>models<span class=\"o\">.</span>BooleanField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">),</span>\n        <span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n</section>\n<section id=\"changing-an-unmanaged-model-to-managed\">\n<h2>未管理状態のモデルを管理状態に変更する<a class=\"heading-anchor\" href=\"#changing-an-unmanaged-model-to-managed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>未管理状態のモデル（<a class=\"reference internal\" href=\"/ja/6.0/ref/models/options/#django.db.models.Options.managed\" title=\"django.db.models.Options.managed\"><code class=\"xref py py-attr docutils literal notranslate\">managed=False</code></a>) を管理状態に変更する場合、 <code class=\"docutils literal notranslate\">managed=False</code> を削除し、マイグレーションを生成してから、モデルにスキーマ関連の変更を加える必要があります。これは、 <code class=\"docutils literal notranslate\">Meta.managed</code> を変更する操作を含むマイグレーションに含まれるスキーマ変更が適用されない可能性があるためです。</p>\n</section>","rootId":"how-to-create-database-migrations","toc":[{"title":"データのマイグレーションと複数のデータベース","anchor":"data-migrations-and-multiple-databases","children":[]},{"title":"ユニークなフィールドを追加するマイグレーション","anchor":"migrations-that-add-unique-fields","children":[{"title":"非アトミックのマイグレーション","anchor":"non-atomic-migrations","children":[]}]},{"title":"マイグレーションの順序をコントロールする","anchor":"controlling-the-order-of-migrations","children":[]},{"title":"サードパーティのアプリ間でデータをマイグレーションする","anchor":"migrating-data-between-third-party-apps","children":[]},{"title":"ManyToManyField を中間 (through) モデルを使うように変更する","anchor":"changing-a-manytomanyfield-to-use-a-through-model","children":[]},{"title":"未管理状態のモデルを管理状態に変更する","anchor":"changing-an-unmanaged-model-to-managed","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to ガイド","url":"/ja/6.0/howto/"}],"prev":{"docname":"howto/custom-model-fields","title":"カスタムのモデルフィールドを作成する","url":"/ja/6.0/howto/custom-model-fields/"},"next":{"docname":"howto/custom-lookups","title":"カスタムのルックアップを書く","url":"/ja/6.0/howto/custom-lookups/"},"formats":{"html":"/ja/6.0/howto/writing-migrations/","markdown":"/ja/6.0/howto/writing-migrations.md","json":"/ja/6.0/howto/writing-migrations.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/howto/writing-migrations.txt","official":"https://docs.djangoproject.com/ja/6.0/howto/writing-migrations/","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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}