快速上手Django(二) Django 根据模型(models)生成更新数据库表make migrations

一、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 文件中。

  1. 接下来可以验证一下迁移时实际执行的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, 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值