<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                <!-- 譯者:Github@wizardforcel --> # 編寫數據庫遷移 # 這一節介紹你可能遇到的在不同情況下如何分析和編寫數據庫遷移. 有關遷移的入門資料,請查看 the topic guide. ## 數據遷移和多數據庫 ## 在使用多個數據庫時,需要解決是否針對某個特定數據庫運行遷移。例如,你可能 只 想在某個特定數據庫上運行遷移。 為此你可以在RunPython中通過查看schema_editor.connection.alias 屬性來檢查數據庫連接別名: ``` from django.db import migrations def forwards(apps, schema_editor): if not schema_editor.connection.alias == 'default': return # Your migration code goes here class Migration(migrations.Migration): dependencies = [ # Dependencies to other migrations ] operations = [ migrations.RunPython(forwards), ] ``` ``` Django 1.8 中新增。 ``` 你也可以提供一個提示作為 **hints參數傳遞到數據庫路由的allow_migrate() 方法: ``` myapp/dbrouters.py class MyRouter(object): def allow_migrate(self, db, app_label, model_name=None, **hints): if 'target_db' in hints: return db == hints['target_db'] return True ``` 然后,要在你的遷移中利用,執行以下操作: ``` from django.db import migrations def forwards(apps, schema_editor): # Your migration code goes here class Migration(migrations.Migration): dependencies = [ # Dependencies to other migrations ] operations = [ migrations.RunPython(forwards, hints={'target_db': 'default'}), ] ``` 如果你的RunPython或者RunSQL操作只對一個模型有影響,最佳實踐是將model_name作為提示傳遞,使其盡可能對路由可見。這對可復用的和第三方應用極其重要。 ## 添加唯一字段的遷移 ## 如果你應用了一個“樸素”的遷移,向表中一個已存在的行中添加了一個唯一的非空字段,會產生錯誤,因為位于已存在行中的值只會生成一次。所以需要移除唯一性的約束。 所以,應該執行下面的步驟。在這個例子中,我們會以默認值添加一個非空的UUIDField字段。你可以根據你的需要修改各個字段。 + 把default=...和unique=True參數添加到你模型的字段中。在這個例子中,我們默認使用uuid.uuid4。 + 運行 makemigrations 命令。 + 編輯創建的遷移文件。 生成的遷移類看上去像這樣: ``` class Migration(migrations.Migration): dependencies = [ ('myapp', '0003_auto_20150129_1705'), ] operations = [ migrations.AddField( model_name='mymodel', name='uuid', field=models.UUIDField(max_length=32, unique=True, default=uuid.uuid4), ), ] ``` 你需要做三處更改: + 從已生成的遷移類中復制,添加第二個AddField操作,并改為AlterField。 + 在第一個AddField操作中,把unique=True改為 null=True,這會創建一個中間的null字段。 + 在兩個操作之間,添加一個RunPython或RunSQL操作為每個已存在的行生成一個唯一值(例如UUID)。 最終的遷移類應該看起來是這樣: ``` # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import migrations, models import uuid def gen_uuid(apps, schema_editor): MyModel = apps.get_model('myapp', 'MyModel') for row in MyModel.objects.all(): row.uuid = uuid.uuid4() row.save() class Migration(migrations.Migration): dependencies = [ ('myapp', '0003_auto_20150129_1705'), ] operations = [ migrations.AddField( model_name='mymodel', name='uuid', field=models.UUIDField(default=uuid.uuid4, null=True), ), # omit reverse_code=... if you don't want the migration to be reversible. migrations.RunPython(gen_uuid, reverse_code=migrations.RunPython.noop), migrations.AlterField( model_name='mymodel', name='uuid', field=models.UUIDField(default=uuid.uuid4, unique=True), ), ] ``` 現在你可以像平常一樣使用migrate命令應用遷移。 注意如果你在這個遷移運行時讓對象被創建,就會產生競爭條件(race condition)。在AddField之后, RunPython之前創建的對象會覆寫他們原始的uuid。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看