Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。

交流群:467338606

网站:http://python.usyiyi.cn/django/index.html

编写数据库迁移

这一节介绍你可能遇到的在不同情况下如何分析和编写数据库迁移. 有关迁移的入门资料,请查看 the topic guide.

数据迁移和多数据库

在使用多个数据库时,需要解决是否针对某个特定数据库运行迁移。例如,你可能 只 想在某个特定数据库上运行迁移。

为此你可以在RunPython中通过查看schema_editor.connection.alias 属性来检查数据库连接别名:

from django.db import migrationsdef forwards(apps, schema_editor):if not schema_editor.connection.alias == 'default':return# Your migration code goes hereclass 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 migrationsdef forwards(apps, schema_editor):# Your migration code goes hereclass 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_literalsfrom django.db import migrations, models
import uuiddef 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。

django 1.8 官方文档翻译: 2-4-4 编写迁移相关推荐

  1. django 1.8 官方文档翻译: 2-5-7 自定义查找

    自定义查找 New in Django 1.7. Django为过滤提供了大量的内建的查找(例如,exact和icontains).这篇文档阐述了如何编写自定义查找,以及如何修改现存查找的功能.关于查 ...

  2. django 1.8 官方文档翻译: 1-2-3 编写你的第一个Django应用,第3部分

    编写你的第一个 Django 程序 第3部分 本教程上接 教程 第2部分 .我们将继续 开发 Web-poll 应用并且专注在创建公共界面 – "视图 (views )". 哲理 ...

  3. django 1.8 官方文档翻译: 13-9-1 如何使用会话

    如何使用会话 Django 提供对匿名会话的完全支持.其会话框架让你根据各个站点的访问者存储和访问任意数据.它在服务器端存储数据并抽象Cookie 的发送和接收.Cookie 包含会话的ID -- 不 ...

  4. django 1.8 官方文档翻译: 2-5-6 多数据库

    多数据库 这篇主题描述Django 对多个数据库的支持.大部分Django 文档假设你只和一个数据库打交道.如果你想与多个数据库打交道,你将需要一些额外的步骤. 定义你的数据库 在Django中使用多 ...

  5. django 1.8 官方文档翻译: 1-1-2 快速安装指南

    快速安装指南 在你开始使用 Django 之前,你需要先安装它.我们有一个 完整安装指南 它涵盖了所有的安装步骤和可能遇到的问题:本指南将会给你一个最简单.简洁的安装指引. 安装 Python 作为一 ...

  6. django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图

    基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式. Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历 ...

  7. django 1.8 官方文档翻译:2-5-9 条件表达式

    条件表达式 New in Django 1.8. 条件表达式允许你在过滤器.注解.聚合和更新操作中使用 if ... elif ... else的逻辑.条件表达式为表中的每一行计算一系列的条件,并且返 ...

  8. django 1.8 官方文档翻译:8-5 加密签名

    加密签名 web应用安全的黄金法则是,永远不要相信来自不可信来源的数据.有时通过不可信的媒介来传递数据会非常方便.密码签名后的值可以通过不受信任的途径传递,这样是安全的,因为任何篡改都会检测的到. D ...

  9. django 1.8 官方文档翻译: 3-4-2 内建显示视图

    Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质. 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html ...

  10. django 1.8 官方文档翻译:2-1-1 模型语法

    模型 模型是你的数据的唯一的.权威的信息源.它包含你所储存数据的必要字段和行为.通常,每个模型对应数据库中唯一的一张表. 基础: 每个模型都是django.db.models.Model 的一个Pyt ...

最新文章

  1. 软件测试方法单元测试例子,service单元测试例子
  2. python编程培训多少钱-python培训一般多少钱?[python培训]
  3. CentOS系统提示用户名不在sudoers文件中
  4. Team Foundation(通常记作“TFS”)
  5. tomcat jdbc SlowQueryReport的实现解读
  6. B端SaaS产品工作流程
  7. 【华为云技术分享】《跟唐老师学习云网络》 - 我的网络概念
  8. 计算机组成原理之指令和寻址方式
  9. div中内部div横向布局
  10. Windows Restart Manager 重启管理器
  11. python中三元_Python三元运算和Python函数介绍
  12. 声音存储空间计算公式_音频中文件大小计算公式(转)
  13. java 报表工具_最好用的5款java web免费报表工具
  14. itext7接口和类概述以及pdf常见操作
  15. 64位 Fedora 11 硬盘安装 配置全解
  16. 按步搭建简单IoT微服务(3)
  17. Ansible企业运维实例(三)—批量硬盘初始化
  18. java+天地图,天地图开发之Android-天地图显示
  19. 将图片保存为.EPS格式
  20. 计算机文字录入ppt,计算机基础—文字录入.ppt

热门文章

  1. Vivado 约束文件XDC使用经验总结
  2. QT编译boost库
  3. 1011.log4cplus移植记录
  4. spring事务管理器的作用_【面试必问】Spring中的事务管理详解
  5. 【STM32】【STM32CubeMX】STM32CubeMX的使用之九:ADC
  6. php gettext 为空,PHP Gettext
  7. QT5开发及实例学习之十四Qt5排版功能
  8. 面向对象的理解及相关概念(封装,继承,多态)
  9. Docker一些常用命令
  10. HP LasterJet 3050驱动安装技巧,面向win7,8,8.1,10