在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 編寫數(shù)據(jù)庫(kù)遷移
編寫自定義存儲(chǔ)系統(tǒng)
高級(jí)
編寫你的第一個(gè)Django應(yīng)用,第5部分
視圖層
Django管理文檔生成器
編寫你的第一個(gè) Django 程序 第3部分
編寫你的第一個(gè)Django應(yīng)用,第6部分
模型層
中間件
測(cè)試
數(shù)據(jù)庫(kù)訪問優(yōu)化
文件上傳
中間件
驗(yàn)證器
基于類的內(nèi)建通用視圖
部署靜態(tài)文件
使用Django認(rèn)證系統(tǒng)
高級(jí)教程:如何編寫可重用的應(yīng)用
Model 類參考
Django 初探
使用Django輸出PDF
模型的實(shí)例
模型
文件上傳
進(jìn)行原始的sql查詢
面向程序員
中間件
編寫數(shù)據(jù)庫(kù)遷移
TemplateResponse 和 SimpleTemplateResponse
異常
Django中的測(cè)試
基礎(chǔ)
管理器
File對(duì)象
URL調(diào)度器
加密簽名
國(guó)際化和本地化
日志
查詢集
django-admin 和 manage.py
使用基于類的視圖處理表單
聚合
內(nèi)建基于類的視圖的API
如何使用會(huì)話
部署 Django
其它
其它核心功能
高級(jí)
Django中的密碼管理
模型元選項(xiàng)
按需內(nèi)容處理
查找 API 參考
高級(jí)
Django 的快捷函數(shù)
Django 的設(shè)置
Admin
開發(fā)過程
新手入門
基于類的視圖
模型實(shí)例參考
信號(hào)
表單素材 ( <code>Media</code> 類)
自定義查找
常見的網(wǎng)站應(yīng)用工具
模型
django.contrib.humanize
Django模版語言
點(diǎn)擊劫持保護(hù)
管理操作
編寫你的第一個(gè) Django 程序 第2部分
Django安全
模式編輯器
多數(shù)據(jù)庫(kù)
部署
基于類的視圖
內(nèi)建的視圖
視圖裝飾器
面向設(shè)計(jì)師
編寫視圖
應(yīng)用程序
如何使用WSGI 部署
參考
表單 API
文件儲(chǔ)存API
認(rèn)證
國(guó)際化和本地化
錯(cuò)誤報(bào)告
基礎(chǔ)
基礎(chǔ)
將遺留數(shù)據(jù)庫(kù)整合到Django
教程
Django異常
編寫你的第一個(gè) Django 程序 第4部分
遷移
分頁
重定向應(yīng)用
表單
從零開始
為模型提供初始數(shù)據(jù)
設(shè)置
使用Django輸出CSV
關(guān)聯(lián)對(duì)象參考
使用表單
Django 中的用戶認(rèn)證
快速安裝指南
安全問題歸檔
數(shù)據(jù)庫(kù)函數(shù)
編寫自定義的django-admin命令
高級(jí)教程
管理文件
格式本地化
基于類的通用視圖 —— 索引
安全
系統(tǒng)檢查框架
為Django編寫首個(gè)補(bǔ)丁
模板層
Widgets
編寫你的第一個(gè) Django 程序 第1部分
執(zhí)行查詢

編寫數(shù)據(jù)庫(kù)遷移

這一節(jié)介紹你可能遇到的在不同情況下如何分析和編寫數(shù)據(jù)庫(kù)遷移. 有關(guān)遷移的入門資料,請(qǐng)查看 the topic guide.

數(shù)據(jù)遷移和多數(shù)據(jù)庫(kù)

在使用多個(gè)數(shù)據(jù)庫(kù)時(shí),需要解決是否針對(duì)某個(gè)特定數(shù)據(jù)庫(kù)運(yùn)行遷移。例如,你可能 只 想在某個(gè)特定數(shù)據(jù)庫(kù)上運(yùn)行遷移。

為此你可以在RunPython中通過查看schema_editor.connection.alias 屬性來檢查數(shù)據(jù)庫(kù)連接別名:

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 中新增。

你也可以提供一個(gè)提示作為 **hints參數(shù)傳遞到數(shù)據(jù)庫(kù)路由的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

然后,要在你的遷移中利用,執(zhí)行以下操作:

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操作只對(duì)一個(gè)模型有影響,最佳實(shí)踐是將model_name作為提示傳遞,使其盡可能對(duì)路由可見。這對(duì)可復(fù)用的和第三方應(yīng)用極其重要。

添加唯一字段的遷移

如果你應(yīng)用了一個(gè)“樸素”的遷移,向表中一個(gè)已存在的行中添加了一個(gè)唯一的非空字段,會(huì)產(chǎn)生錯(cuò)誤,因?yàn)槲挥谝汛嬖谛兄械闹抵粫?huì)生成一次。所以需要移除唯一性的約束。

所以,應(yīng)該執(zhí)行下面的步驟。在這個(gè)例子中,我們會(huì)以默認(rèn)值添加一個(gè)非空的UUIDField字段。你可以根據(jù)你的需要修改各個(gè)字段。

  • 把default=...和unique=True參數(shù)添加到你模型的字段中。在這個(gè)例子中,我們默認(rèn)使用uuid.uuid4。
  • 運(yùn)行 makemigrations 命令。
  • 編輯創(chuàng)建的遷移文件。

生成的遷移類看上去像這樣:

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),
        ),
    ]

你需要做三處更改:

  • 從已生成的遷移類中復(fù)制,添加第二個(gè)AddField操作,并改為AlterField。
  • 在第一個(gè)AddField操作中,把unique=True改為 null=True,這會(huì)創(chuàng)建一個(gè)中間的null字段。
  • 在兩個(gè)操作之間,添加一個(gè)RunPython或RunSQL操作為每個(gè)已存在的行生成一個(gè)唯一值(例如UUID)。

最終的遷移類應(yīng)該看起來是這樣:

# -*- 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),
        ),
    ]

現(xiàn)在你可以像平常一樣使用migrate命令應(yīng)用遷移。

注意如果你在這個(gè)遷移運(yùn)行時(shí)讓對(duì)象被創(chuàng)建,就會(huì)產(chǎn)生競(jìng)爭(zhēng)條件(race condition)。在AddField之后, RunPython之前創(chuàng)建的對(duì)象會(huì)覆寫他們?cè)嫉膗uid。

上一篇:從零開始下一篇:按需內(nèi)容處理