Django开发中使用South进行数据库迁移的使用总结

  South的详细资料可产看官方文档http://south.readthedocs.org/en/latest

  South安装配置

  pip install south

  安装成功之后,修改django项目中的settings.py文件, 在INSTALLED_APPS中追加 ‘south’, 然后重新执行: ./manage.py syncdb 去创建South迁移跟踪表。

  创建初始版本信息

  一个new app(还未创建数据库表),在写好其应用里的models.py之后就可以生成数据库表结构的初始版本了。

  第1步,执行 ./manage.py schemamigration  your_app_name   --initial 命令,生成表结构的初始版本,此命令执行后,会自动在你的app目录下创建一个migrations目录并生成0001_initial.py 脚本。

  schemamigration只是在你的app中写入一个大的迁移, 真正要在数据库中迁移还要执行第2步。

  第2步,执行 ./manage.py migrate your_app_name 命令,在数据库中创建表结构。

  如果表结构已经存在, 则可以执行 ./manage.py migrate your_app_name --fake 命令, 告诉South对于已经存在的表结构不再创建。否则,会出现DatabaseError: table ”your_table“  alreadey exists的错误。我第一次使用就在操作失误导致一个表已经建立,出现这种问题。

  

  修改Model字段

    之后再对models.py文件作修改之后,如果自己去数据库中修改表的字段是很麻烦的。

  第1步,执行 ./manage.py schemamigration your_app_name  --auto 命令, south会自动对比你的app中migrations目录下的0001_initial.py并生成0002_auto_xxxx.py文件

  第2步,执行 ./manage.py migrate your_app_name 让数据库修改表结构,使新版本表结构生效。

  

  当在models.py的里添加新的属性时, 上述操作默认你添加的属性有一个default值, South会替你给数据库表中已存在的数据在新产生的字段上添加此默认值。如果在添加的属性没有默认值,也就是你在models.py中的类里添加新的属性时的参数null=False。 在执行第1步操作的时候, South会显示出两个选项:

  ./manage.py schemamigration your_app_name --auto

  ? The field 'your_model_class_name.new_attribute' does not have a default specified, yet is NOT NULL.

  ? Since you are adding or removing this field, you MUST specify a default

  ? value to user for existing rows. Would you like to:

  ?  1.Quit now, and add a default to the field in models.py

  ?  2.Specify a one-off value to use for existing columns now

  ? Please select a choice:

./manage.py schemamigration your_app_name --auto

  ? The field 'your_model_class_name.new_attribute' does not have a default specified, yet is NOT NULL.

  ? Since you are adding or removing this field, you MUST specify a default

  ? value to user for existing rows. Would you like to:

  ?  1.Quit now, and add a default to the field in models.py

  ?  2.Specify a one-off value to use for existing columns now

  ? Please select a choice:

  如果你选择1, 那么指令不会做任何事并且退出, 之后你可以去修改你的models.py, 然后添加一个默认值。如果你选择2, 你将会看到一个Python的提示, 让你输入一个值, 用于你的这次迁移为那些已经存在的数据在新的字段上写入你输入的这个值。

? Please select a choice: 2
? Please enter Python code for your one-off default value.
? The datetime module is available, so you can do e.g. datetime.date.today()
>>>

  在>>>处输入你想要输入的值。对于你输入的值, 只会用于本次迁移时对已存在数据在新的字段上赋一个值。如果你不想你的model属性有默认值, 这样做是一个很好的选择。选择完选项之后,继续执行第2步完成迁移。


  转化已存在app(数据库表已经创建) Converting to An App

  有一个已经存在的应用, 而且数据库表已经创建, 要想进行数据库迁移, 需要以下三步:

  第1步, 首先确保在settings.py中的INSTALLED_APP里添加了‘south’

  第2步, 执行 ./manage.py syncdb 将South表加载(或者说是添加)到数据库中(如果没有, 无法执行迁移)

  第3步, 执行 ./manage.py convert_to_south your_app_name -South会自动帮你执行并且假装你是第一次执行迁移。

  

  

[更新中]【South使用总结】django开发中使用South进行数据库迁移的更多相关文章

  1. django开发中利用 缓存文件 进行页面缓存

    首先我们先来了解下浏览器的缓存 浏览器缓存机制 Cache-control策略 Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是 ...

  2. django开发中关于外键设置

    django开发中关于外键设置 我们建模型的时候会用到ForeignKey 而由于外键的约数会导致一些保存 所有我们ctrl+左键进入源码 源码 def __init__(self, to, on_d ...

  3. 怎样实现了捕获应用中的日志在android开发中

    怎样实现了捕获应用中的日志在android开发中,大家可研究一下. Process mLogcatProc = null; BufferedReader reader = null; try { mL ...

  4. Python Django开发中XSS内容过滤问题的解决

    from:http://stackoverflow.com/questions/699468/python-html-sanitizer-scrubber-filter 通过下面这个代码就可以把内容过 ...

  5. Django学习系列14:第一个数据库迁移

    在Django中,ORM的任务是模型化数据库. 创建数据库其实是由另一个系统负责的叫做迁移. 迁移的任务是根据你对models.py文件的改动情况,添加或删除表和列. 可以把迁移想象成数据库使用的版本 ...

  6. 【Django】依赖auth.user的数据库迁移,以及admin用户非交互式创建

    admin用户非交互式创建: echo "from django.contrib.auth.models import User; User.objects.create_superuser ...

  7. 【Django】Django开发中的日志输出

    开发环境:Ubuntu16.04+Django 1.11.9+Python2.7 一:使用自定义函数输出日志到log文件: import time def print_log(log): file_o ...

  8. 那些在django开发中遇到的坑

    1. 关于csrf错误 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或 ...

  9. django 开发中数据库做过什么优化??

    1.设计表时,尽量少使用外键,因为外键约束会影响插入和删除性能: 2.使用缓存,减少对数据库的访问: 3.在 orm 框架下设置表时,能用 varchar 确定字段长度时,就别用 text: 4.可以 ...

随机推荐

  1. rpm卸载软件error preun

    这两天,使用ipvsadm -ln总是显示空. 后来,使用strace ipvsadm -ln定位 看来,是ipvsadm模块有问题,卸载了再重新安装吧,结果出现这种问题. 从来没遇到这种问题: er ...

  2. 6.0动态加载权限用PermissionGen

    ndroid 6.0 新增加了运行时的动态添加权限,在此介绍一个第三方库,PermissionGen,可以很方便简洁的增加 6.0权限 首先给大家上  PermissionGen 库地址:https: ...

  3. javascript删除JSON元素

    首先要搞清JSON的数据格式,我这里所说的JSON都是指javascript中的. JSON数据是由对象和数组数据结构组成,我们只要学会javascript中对对象和数组的删除方法即可对JSON项进行 ...

  4. 2017-02-20 Sql Server2016安装后无法找到Microsoft Sql Server Management Studio管理器

    最近安装的sql sever2016后发现没有Sql server management studio管理工具,无法操作sql server 解决方案,可去官网单独下载 Sql Server Mana ...

  5. pythoncook 随记

    第一章 数据结构与算法 1 赋值多个变量 *2 collections deque 构造固定大小队列,插入删除比list快3 查找最大和最小元素的N个元素 heapq nlargest() nsmal ...

  6. nyoj 42 一笔画 欧拉通路

    http://acm.nyist.net/JudgeOnline/problem.php?pid=42 一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc ...

  7. 轮廓Outline|表格Table实例

    1.使用outline属性在元素周围画一条线. border:red solid thin; outline:#00ff00 dotted thick; outline-style:dotted|da ...

  8. python编程实例-dmidecode系统信息搜集

    #!/usr/bin/env python from subprocess import PIPE,Popen def getDmi(): p = Popen(['dmidecode'],stdout ...

  9. C语言中time函数获取系统时间

    可以通过time()函数来获得计算机系统当前的日历时间(Calendar Time),处理日期时间的函数都是以本函数的返回值为基础进行运算.其原型为: time_t time(time_t * t); ...

  10. HTTP协议状态代码和错误状态含义的解释

    面试互联网公司经常被问的就是HTTP协议的知识,甚至比TCP/IP问的还多,其中HTTP代码的知识也是开发过程中经常会接触的,今天学习所有 HTTP 状态代码及其定义. 代码  指示     2xx  ...