文章目录
一、Django 根据模型(models)生成更新数据库表make migrations
0. 基础
Django通过ORM来操作数据库,而其中数据库表结构的创建和变更因为尤其重要。所以Django需要对其每一次的操作都进行记录和留档,以实现每次只执行增量变更,同时方便回溯和回退。 Django中专门负责这一记录功能的模块叫迁移(migrate)。
所谓ORM就是将面向对象的python操作转变为数据库可识别的SQL语句,而数据库中每张表对应着Django中的一个模型类,也就是在models.py中定义的一个class。所以创建一张张SQL表也就变成了定义一个个模型类。
一个models.py中写着所有的模型类,每一次对单个类做的微小的修改,不可能让所有表都跟着再做一次SQL操作,所以务必得是增量操作。
Django项目里的每一个应用都自带一个
migrations
目录,每次执行跟表结构变更相关的操作,都会在这里生成增量的操作文件,这些文件叫做迁移文件。
migrations目录中的众多迁移文件对应着一批批的操作,这些文件被按照时间顺序先后执行就完成了最终的结果。
那么Django怎么知道某一个文件有没有被执行过呢?
这个也很简单,对每一次完成的操作记录一下时间就可以了。这些操作都被记录在项目自带的django_migrations表中。
Django提供的迁移工具可以将对模型所做的更改应用到数据库,修改对应的表单结构和数据。
Django提供了3个常用命令,分别是 migrate、makemigration、sqlmigrate。
- migrate 命令负责迁移应用到数据库
- makemigration 负责将模型的变动换成迁移
- sqlmigrate 会输出应用变动时实际执行的SQL语句
每个应用都有自己的迁移,因此每个应用的文件夹下都有一个migrations包。可以把迁移看做数据库表结构变更的版本控制系统。makemigration会将模型的变更打包到单个迁移文件中。migrate命令用于将这个迁移应用到数据库中。
总结:Django的开发方式都是先写Model,然后通过makemigrations 和 migrate来生成表。 makemigration生成ddl语句,migrate执行ddl语句。
makemigrations会在当前目录下生成一个migrations文件夹,该文件夹的内容就是数据库要执行的内容
python manage.py makemigrations
migrate就是执行之前生成的migrations文件,这一步才是操作数据库的一步
python manage.py migrate
Django每次更新模型都需要执行以上两步,需要注意的是Django模型增加内容需要设定变量的初始值。
1. 根据mode生成更新数据库表
1) 首先在models.py中创建或者修改模型类
我们编辑上一篇quickstart项目,创建myapp应用下的models.py
vi myapp/models.py
我们直接参考官方的模型举例 ,如下:
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
2) 跑python manager.py makemigrations
创建本次修改的迁移文件,此时会去数据库中查找上一次执行的文件并记录在本文件中
(quick-start) [root@dev quickstart]# python manage.py makemigrations myapp
Migrations for 'myapp':
myapp/migrations/0001_initial.py
- Create model Person
上面的命令会扫描
myapp
应用中的模型,与当前包含的迁移文件中的版本进行比较,然后生成一个新的迁移,迁移的内容放在0001_initial.py
文件中。
- 接下来可以验证一下迁移时实际执行的SQL语句
(quick-start) [root@dev quickstart]# python manage.py sqlmigrate myapp 0001 --
-- Create model Person
--
CREATE TABLE `myapp_person` (`id` bigint AUTO_INCREMENT NOT NULL PRIMARY KEY,