Django中对Model进行修改是件麻烦的事情,syncdb命令仅仅创建数据库里还没有的表,它并不对已存在的数据表进行同步修改,也不处理数据模型的删除。 如果你新增或修改数据模型里的字段,或是删除了一个数据模型,你需要手动在数据库里进行相应的修改或者使用South。Django 1.7中已经集成了South的代码,提供了3个新命令:

  • migrate: 用于执行迁移动作,具有syncdb的功能
  • makemigrations: 基于当前的model创建新的迁移策略文件
  • sqlmigrate: 显示迁移的SQL语句,具有sqlall的功能
对Model做了修改后,使用makemigrations记录修改:
有了新的migration文件,就可以使用migrate修改数据库模式:
python manage.py migrate
Operations to perform:Synchronize unmigrated apps: sessions, admin, messages, auth, staticfiles, contenttypesApply all migrations: books
Synchronizing apps without migrations:Creating tables...Installing custom SQL...Installing indexes...
Installed 0 object(s) from 0 fixture(s)
Running migrations:Applying books.0003_auto... OK

依据Model修改关系数据库是开发中的一个重要的问题,解决这个问题可以提升开发速度,不过要在生产环境中随便使用migrate操作数据库还是很危险的,有时候需要手动修改数据库。

手动修改数据库

当处理模型修改的时候:

  • 如果模型包含一个未曾在数据库里建立的字段,Django会报出错信息。 当你第一次用Django的数据库API请求表中不存在的字段时会导致错误。
  • Django不关心数据库表中是否存在未在模型中定义的列。
  • Django不关心数据库中是否存在未被模型表示的table。

添加字段

  1. 在你的模型里添加字段。下例向Book模型添加num_pages字段:

    class Book(models.Model):
      title = models.CharField(max_length=100)
      authors = models.ManyToManyField(Author)
      publisher = models.ForeignKey(Publisher)
      publication_date = models.DateField()
      **num_pages = models.IntegerField(blank=True, null=True)**  def __unicode__(self):
        return self.title 
  1. 运行manage.py sqlall yourappname来测试模型新的CREATE TABLE语句。

    CREATE TABLE "books_book" (
      "id" serial NOT NULL PRIMARY KEY,
      "title" varchar(100) NOT NULL,
      "publisher_id" integer NOT NULL REFERENCES "books_publisher" ("id"),
      "publication_date" date NOT NULL,
      "num_pages" integer NULL
    );
  1. 开启你的数据库的交互命令界面(比如,psql或者mysql,或者可以使用manage.py dbshell。 执行ALTER TABLE语句来添加新列。

    ALTER TABLE books_book ADD COLUMN num_pages integer;  

添加 非NULL 字段

先创建 NULL 型的字段,然后将该字段的值填充为某个默认值,然后再将该字段改为 NOT NULL 型

BEGIN;
ALTER TABLE books_book ADD COLUMN num_pages integer;
UPDATE books_book SET num_pages=0;
ALTER TABLE books_book ALTER COLUMN num_pages SET NOT NULL;
COMMIT;

添加ForeignKey或ManyToManyField

添加外键即是添加key_id的integer字段,添加多对多字段是创建一个新的数据表。

删除字段

比较简单,将表中的某列删掉即可

ALTER TABLE books_book DROP COLUMN num_pages;

使用sqlite3时,会有些麻烦,sqlite3不支持删除列操作,只有有限地 ALTER TABLE 支持。你可以使用它来在表的末尾增加一列,可更改表的名称。 如果需要对表结构做更复杂的改变,则必须重新建表。重建时可以先将已存在的数据放到一个临时表中,删除原表, 创建新表,然后将数据从临时表中复制回来。

如,假设有一个 t1 表,其中有 "a", "b", "c" 三列, 如果要删除列 c :

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

删除多对多关联字段

删掉多对多关联的数据表即可

DROP TABLE books_book_authors;

删除模型

删除数据表即可

DROP TABLE books_book;

数据迁移

django 项目提供了一个导出的方法 python manage.py dumpdata, 不指定 appname 时默认为导出所有的app

python manage.py dumpdata myapp > myapp.json

导出的文件内容格式:

[{"model": "myapp.person","pk": 1,"fields": {"first_name": "John","last_name": "Lennon"}},{"model": "myapp.person","pk": 2,"fields": {"first_name": "Paul","last_name": "McCartney"}}
]

数据导入:

python manage.py loaddata myapp.json

导出用户数据:

python manage.py dumpdata auth > auth.json

Django模型修改及数据迁移相关推荐

  1. Django 应用分库,数据迁移成功,数据库没有生成表

    Django 应用分库,数据迁移成功,数据库没有生成表 背景:不同应用对应不同数据库,在迁移数据成功后,数据库没有生成表 Django 官网:https://docs.djangoproject.co ...

  2. Python轻量级Web框架Flask(5)——Flask模型基础和数据迁移

    0.前言:学习这部分的前提是对python的面向对象有一定的了解,同时对MySQL有扎实的学习 1.Flask模型基础知识: Flask模型 ORM (注意:在flask中用ORM可以实现SQL语句功 ...

  3. Django模型修改数据

    修改数据 1.修改单个数据 1.通过get()得到要修改的实体对象 2.通过实体对象的属性修改属性值 3.再通过实体对象的save()保存回数据库 ex: au=Author.objects.get( ...

  4. python爬虫 django搜索修改更新数据_django_数据库操作—增、删、改、查

    增加 增加数据有两种方法 1> sava >>> from datetime import date >>> book = BookInfo( btitle= ...

  5. python爬虫 django搜索修改更新数据_一文搞懂Django数据库查询操作

    本文略长,读完约需十分钟.当做复习笔记效果更佳. 查询操作: 数据查询是数据库操作中一个非常重要的技术.查询一般就是使用filter.exclude以及get三个方法来实现.我们可以在调用这些方法的时 ...

  6. python爬虫 django搜索修改更新数据_python应用:Django中更新多个对象数据与删除对象的方法...

    Python是一种解释型脚本语言,可以应用于以下领域: web和Internet开发 科学计算和统计 人工智能 教育 桌面界面开发 软件开发 后端开发 网络爬虫 更新多个对象 例如说我们现在想要将Ap ...

  7. Elasticsearch--高级-映射_修改映射 数据迁移---全文检索引擎ElasticSearch工作笔记019

    然后我们之前都添加映射,那么如果我们修改,映射,怎么修改呢? 我们可以直接修改嘛,比如,直接在mappings中修改,对应的类型,可以看到一执行报错对吧.不能直接修改. 可以看到,如果我们这里把这个e ...

  8. GreenDao3.2 版本升级数据迁移

    参考:https://stackoverflow.com/questions/13373170/greendao-schema-update-and-data-migration/30334668#3 ...

  9. django 数据迁移 (migrations)

    表已存在_错误参考 迁移常见错误解决方案 django官网迁移教程 执行启动迁移 DJANGO_ENV='test' python manage.py makemigrations --setting ...

最新文章

  1. python自定义图标_Python-nautilus:添加自定义标志(叠加图标)
  2. Android 个人学习笔记- 导入android项目,无法自动生成R文件的解决方法
  3. Mybatis 查询小技巧
  4. java 连接两个arraylist,java – 在两个线程之间共享一个ArrayList?
  5. mysql半同步复制实现
  6. 深度学习 相机标定_基于深度学习的多传感器标定
  7. Web 浏览器相关的一些概念
  8. Android开发学习笔记:圆角的Button
  9. 硕士学位论文(2022年) Latex模板 模板修改记录 总结
  10. S7-1200 PLC与电子秤进行MODBUS RTU通信的具体步骤
  11. 【Python】多线程爬取某站高颜值小姐姐照片(共1.62GB)
  12. 【推导】线性变换与在基下的矩阵一一对应
  13. arm-linux东东之nand之2:3c2440_nand_probe
  14. Mybatis超强大的动态 SQL 大全
  15. 服务器cpu性能最大值,服务器cpu性能排行
  16. H5跳转App、跳转小程序
  17. Android 12系统源码_系统壁纸(一)系统壁纸的原理分析
  18. POJ-3322 Bloxorz I
  19. 常用电子元器件电路符号及实物外形图
  20. 测试左移和右移:不是左右逢源而是左右突击

热门文章

  1. deepin应用分发_Deepin Dock隐藏功能等功能说明
  2. 波士顿动力的机器狗上班了!挪威石油公司还发其工号
  3. 打游戏学习人工智能!不写代码|湾区人工智能
  4. 【比赛经验】陈成龙博士Kaggle计算机编程竞赛数据挖掘经验分享
  5. 查看电脑boot mode方式
  6. android xml 焦点,android TV 焦点选中放大效果
  7. 图片像QQ有消息闪动的代码:
  8. 星巴克饮品中竟喝出活蟑螂?官方回应了...
  9. 2022春节档新片预售总票房达1.08亿
  10. 特斯拉电动皮卡量产时间还会推迟 内部人士称已被推迟到2023年