Django学习系列14:第一个数据库迁移
在Django中,ORM的任务是模型化数据库。
创建数据库其实是由另一个系统负责的叫做迁移。
迁移的任务是根据你对models.py文件的改动情况,添加或删除表和列。
可以把迁移想象成数据库使用的版本控制系统,后面会看到,把应用部署到线上服务器审计数据库时,迁移十分有用。
现在只需要知道如何创建第一个数据库迁移,使用makemigrations命令创建迁移:
# python manage.py makemigrations
Migrations for 'lists':
lists/migrations/0001_initial.py
- Create model Item
# ls lists/migrations/
0001_initial.py __init__.py __pycache__
Python一开始能给.text属性赋值,继承models.Model的类映射到数据库中的一个表,默认情况下,这种类会得到一个自动生成的id属性,作为表的主键,但是其他列都要自行定义。
# lists/models.py from django.db import models # Create your models here.
from django.db import models class Item(models.Model):
text = models.TextField()
django提供了很多其他字段类型,IntegerField, CharField, DateField等,使用TextField 而不是CharField,是因为CharField需要限制长度,目前,这个字段的长度是随意的。关于字段类型的更多介绍可以阅读djang教程和文档
添加新字段就要创建新迁移
运行测试得到另一个数据库错误# python manage.py test lists
django.db.utils.OperationalError: no such column: lists_item.text
出现这个错误的原因是在数据库中添加了一个新字段,所以要再创建一个迁移。
创建迁移试试
# python manage.py makemigrations
You are trying to add a non-nullable field 'text' to item without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
) Provide a one-off default now (will be set on all existing rows with a null value for this column)
) Quit, and let me add a default in models.py
Select an option:
这个命令不允许添加没有默认值的列,选择第二个选项,然后在models.py中设定一个默认值。
class Item(models.Model):
text = models.TextField(default='')
现在应该可以顺利创建迁移了。
# python manage.py makemigrations
Migrations for 'lists':
lists/migrations/0002_item_text.py
- Add field text to item
在models.py中添加了两行新代码,创建了两个数据库迁移,由此得到的结果是,模型对象上的.text属性能被识别为一个特殊属性了,因此属性的值能保存在数据库中,测试也能通过了
# python manage.py test lists
Creating test database for alias 'default'...
System check identified no issues ( silenced).
....
----------------------------------------------------------------------
Ran tests in .105s OK
Destroying test database for alias 'default'...
下面提交创建的第一个模型
$ git status # see tests.py, models.py, and untracked migrations(看见tests.py, models.py以及两个没有跟踪的迁移文件)
$ git diff # review changes to tests.py and models.py(审查tests.py and models.py)
$ git add lists
$ git commit -m "Model for list Items and associated migration——列表项和相关迁移的模型 "
Django学习系列14:第一个数据库迁移的更多相关文章
- Django学习系列之Form基础
Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...
- Python学习系列(七)( 数据库编程)
Python学习系列(七)( 数据库编程) Python学习系列(六)(模块) 一,MySQL-Python插件 Python里操作MySQL数据库,需要Python下安装访 ...
- [更新中]【South使用总结】django开发中使用South进行数据库迁移
Django开发中使用South进行数据库迁移的使用总结 South的详细资料可产看官方文档http://south.readthedocs.org/en/latest South安装配置 pip i ...
- Django 学习笔记(七)数据库基本操作(增查改删)
一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.p ...
- Entity Framework 5.0系列之Code First数据库迁移
我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...
- Django学习day7——简单的使用数据库和模型
Django支持的数据库 PostgreSQL SQLite 3 MySQL Oracle 其中SQLite 3不需要安装,因为SQLite使用文件系统上的独立文件来存储数据 这里我们用SQLite ...
- Django学习系列6:使用selenium测试用户交互
学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...
- 【Django】依赖auth.user的数据库迁移,以及admin用户非交互式创建
admin用户非交互式创建: echo "from django.contrib.auth.models import User; User.objects.create_superuser ...
- Django学习系列18:使用迁移创建生产数据库
Django生成一个很有帮助的错误信息,大意是说没有正确设置数据库. 你可能会有疑惑,为什么在单元测试一切都运行ok,这是因为Django为单元测试创建了专用的测试数据库——这是Django中Test ...
随机推荐
- Web19_事务
MySQL的事务控制: 开启事务:start transaction; 提交:commit(); 回滚:rollback(); JDBC事务控制: 开启事务:setAutoCommit(false); ...
- //C#中的访问数据符
[在命名空间里面直接定义类型只能用internal 或 public ] [要被同个解决方案内 其他项目访问 ,加引用 导命名空间]. [类的默认修饰符是internal] 1.Private ...
- 【.NET】由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。
前言 上段时间做项目时,遇到如题之类问题,如今过去有一段时间了,具体出现的情形忘了,当时虽然找到了解决方法,但是依旧没有弄明白出现此种情况是何种原因,后来在微软的帮助支持中心找到了答案,特此记录,以防 ...
- IE条件注释语句
项目 范例 说明 ! [if !IE] The NOT operator. This is placed immediately in front of the _feature_, _operato ...
- 用yum安装的方法部署lamp服务
# yum install -y httpd php php-mysql mariadb mariadb-server# vim /etc/httpd/conf/httpd.conf <If ...
- 【DSP开发】【Linux开发】Linux下PCI设备驱动程序开发
PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以Inte ...
- 【Linux开发】内核模块简介
一. 摘要 这篇文章主要介绍了Linux内核模块的相关概念,以及简单的模块开发过程.主要从模块开发中的常用指令.内核模块程序的结构.模块使用计数以及模块的编译等角度对内核模块进行介绍.在Linux系统 ...
- sqlalchemy的join使用
——.先看mysql的join链接方法 #encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Floa ...
- 关于一个查询的JAVA界面,希望对你有启发
package work2; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; ...
- H.Holy Grail ( floyd )(The Preliminary Contest for ICPC Asia Nanjing 2019)
题意: 给出一个有向图,再给出6条原来不存在的路径,让你在这6条路径上添加一个最小的数,使图不存在负环. 思路: 直接6遍 floyd 输出就行了. #include <bits/stdc++. ...