makemigrations 和 migrate工作原理分别是什么
有一道关于python-django开发工程师的面试题:
- 内容大致是makemigrations 和 migrate 工作原理分别是什么,
- 如果不想使用 Django 的 makemigrations 和 migrate 功能,但是不小心执行了这两个命令会发生什么,
- 如何禁用 migrate 的功能。
下面我们来分析一下这几个问题。
首先:
manage.py是每个django项目中自动生成的一个用于管理项目的脚本文件。需要通过python命令执行。manage.py接受的是Django提供的内置命令。
内置命令包含:
- check
- makemigrations
- migrate
- runserver
- startapp
- startproject
- 还有其他的我先不写了,这是比较常用的
- 本篇文章主要根据题目分析makemigrations和migrate
makemigrations:
- 根据检测到的模型创建新的迁移。迁移的作用,更多的是将数据库的操作,以文件的形式记录下来,方便以后检查、调用、重做等等。
有这样一道很熟悉的命令:
python manger.py makemigrations
相当于在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py。
但是 这个改动还没有作用到数据库文件
个人白话翻译:也就是说你改了models的时候,你就得删了0001这个日志文件,然后删库重来 python manage.py makemigrations 创建新的迁移
migrate:
python manage.py migrate
- 使数据库状态与当前模型集和迁移集同步。说白了,就是将对数据库的更改,主要是数据表设计的更改,在数据库中真实执行。例如,新建、修改、删除数据表,新增、修改、删除某数据表内的字段等等。
个人白话翻译:你改了models的时候,数据库也会真实的执行。
在python manger.py makemigrations之后执行命令:
python manager.py migrate
就将该改动作用到数据库文件
如何禁用migrate的功能:
Django < 1.9版本时
from settings import *
class DisableMigrations(object):def __contains__(self, item):return Truedef __getitem__(self, item):return 'notmigrations'
MIGRATION_MODULES = DisableMigrations()
Django >= 1.9版本时
有这么一个配置项目 MIGRATION_MODULES。
from settings import *
MIGRATION_MODULES = {'auth': None,'contenttypes': None,'default': None,'sessions': None,'core': None,'profiles': None,'snippets': None,'scaffold_templates': None,
其他Django版本:
SOUTH_TESTS_MIGRATE = False
基于元类设计的makemigrations和migrate
makemigrations和migrate是两条基于元类设计的Django ORM数据库命令
python的元类:
元类就是用来创建类的“东西”。你创建类就是为了创建类的实例对象。
元类就是用来创建这些类(对象)的,元类就是类的类
基于django-ORM的元类
ORM:对象关系映射.
用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
其本质是通过调用对象实现同等的sql语句
我们来看下面代码:
class Field(object):def __init__(self,name,column_tyoe):self.name = nameself.column_type = column_tyoedef __str__(self):return '<%s:%s>'%(self.__class__.__name__,self.name)class StringField(Field):def __init__(self,name):super(StringField,self).__init__(name,"varchar(100)")class IntegerField(Field):def __init__(self,name):super(IntegerField,self).__init__(name,"bigint")class ModelMetaClass(type):def __new__(cls, name,bases,attrs):if name == "Model":return type.__new__(cls,name,bases,attrs)print('found model:%s'%name)mapping = dict()for k,v in attrs.items():if isinstance(v,Field):print("Found mapping:%s ==>%s"%(k,v))mapping[k] = vfor k in mapping.keys():attrs.pop(k)attrs['__mappings__'] = mappingattrs['__table__'] = namereturn type.__new__(cls,name,bases,attrs)class Model(dict,metaclass = ModelMetaClass):def __init__(self,**kwargs):super(Model,self).__init__(**kwargs)def __getattr__(self, key):try:return self[key]except KeyError:raise AttributeError("Module objects has no attribute %s"%key)def __setattr__(self, key, value):self[key] = valuedef save(self):fields = []args = []for k,v in self.__mappings__.items():fields.append(v.name)args.append(getattr(self,k,None))sql = 'insert into %s (%s) values (%s)'%(self.__table__,",".join(fields),",".join(str(i) for i in args))print("SQL:%s"%sql)print("ARGS: %s"%str(args))class User(Model):# 定义类的属性到列的映射:id = IntegerField('id')name = StringField('username')email = StringField('email')password = StringField('password')u = User(id=12345, name='Batman', email='batman@nasa.org', password='iamback')
u.save()
中心思想: 用元类来创建user类,id、name、email、password等属性。传递到元类,元类接受之后把他们转换成字典,用_ _mapings保存,也就是user用__table__保存.
本篇整合:
1、makemigrations 和 migrate 工作原理分别是什么:
- makemigrations:根据检测到的模型创建新的迁移。迁移的作用,更多的是将数据库的操作,以文件的形式记录下来,方便以后检查、调用、重做等等。
- migrate:使数据库状态与当前模型集和迁移集同步。说白了,就是将对数据库的更改,主要是数据表设计的更改,在数据库中真实执行。例如,新建、修改、删除数据表,新增、修改、删除某数据表内的字段等等。
2、如果不想使用 Django 的 makemigrations 和 migrate 功能,但是不小心执行了这两个命令会发生什么,
- 首先在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py,
- 接着执行migrate的话,这时候会作用到数据库文件,产生对应的表
3、如何禁用 migrate 的功能。
- 详情见文中各版本对应设置。
makemigrations 和 migrate工作原理分别是什么相关推荐
- 彩超探头频率高低的区别_超声波液位开关和液位开关的区别,它们的工作原理分别是什么?...
近年来,随着电子技术和自动化的不断发展,液位测量与控制技术有很大的提高,日化产品.食品饮料.医药等行业的生产发展都不离不开液位的控制,可见液位传感器的重要性日益凸显,甚至直接影响产品的质量.下面我们了 ...
- 服务器看门狗芯片电路图,看门狗芯片-MAX706看门狗电路和AD7988工作原理分别是什么?...
主要用于电源监控和看门狗,在上电期间只要Vcc大于1.0V,就能保证输出电压不高于0.4V的低电平.在Vcc上升期间RESET维持低电平直到电源电压升至复位门限(4.或4.)以上.在超过此门限后,内部 ...
- makemigrations 和 migrate区分
内容大致是makemigrations 和 migrate 工作原理分别是什么 makemigrations:根据检测到的模型创建新的迁移.迁移的作用,更多的是将数据库的操作,以文件的形式记录下来,方 ...
- rocketMQ —— 02(集群搭建、rocketmq工作原理)
目录标题 一.相关推荐 二.基本架构图: 三.集群模式 1.单Master模式(这种单节点的理论上不叫集群) 2.多Master模式 3.多Master多Slave模式(异步) 4.多Master多S ...
- 分段式多级离心泵_分段式多级离心泵工作原理
分段式多级离心泵中段每个叶轮的外面均安装有一个导轮,导轮是一个固定不动的圆盘,它的作用是把从叶轮甩出的液体的一部分动能通过减速而转化为静压能,并且把这些液体收集后沿径向回流而导人到下一级叶轮人口处.寻 ...
- 分段式多级离心泵_D型卧式多级泵结构组成及工作原理
D型卧式多级泵结构组成及工作原理 D型卧式多级泵结构组成: D型卧式多级泵分双层壳体式及分段式两种,目前使用分段式多级离心泵的较多.分段式D型卧式多级泵是一种垂直剖分多级泵,它有一个前段.一个尾段和若 ...
- 分段式多级离心泵_分段式多级离心泵的工作原理及结构图
分段式多级离心泵的工作原理:分段式多级离心泵中部的每个叶轮都配有一个导向轮,该导向轮是一个固定盘. 其功能是通过减速将从叶轮喷出的液体的部分动能转换为静能,并收集沿径向返回的液体,将其引导至下一个叶轮 ...
- 介绍嘉宾的顺序左右之分_液压系统顺序阀工作原理、功用、性能及其应用
本文大兰液压厂家主要跟大家介绍下顺序阀工作原理.功用.性能及其应用: 1.工作原理 顺序阀也有直动式和先导式之分,根据控制压力来源的不同,它还有内控式和外控式之分. 图1所示为直动式内控顺序阀的作用原 ...
- 分段式多级离心泵_离心泵与多级离心泵工作原理
离心泵 工作原理:离心泵工作时,液体注满泵壳,叶轮高速旋转,液体在离心力作用下产生高速度,高速液体经过逐渐扩大的泵壳通道,动压头转变为静压头. 性能特点: 高效节能:泵有高效的水力形线,工作效率高. ...
最新文章
- mysql view none,MySQL笔记之视图的使用详解
- redis High Availability---Redis Sentinel翻译
- vim实用配置(转)
- 利用java实现的一个发送手机短信的小例子
- Java和ABAP里的外部类和内部类
- 九九乘法表的C语言实现
- The Pilots Brothers' refrigerator
- CentOS 国内yum源
- 消费者服务消费延时分析
- 深入理解 nvidia-docker 2.0
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-实现字典的打印...
- 强烈推荐Seam实战
- 窄带包络Matlab分析,窄带随机过程的产生及其性能测试
- 自己使用的jquery公用common.js
- gromacs 安装_gromacs cpu版安装
- AD软件关于覆铜的高级规则设置
- linux 编辑文件乱码,Linux中vi编辑器显示中文乱码的问题
- MySQL8.0安装与基于二进制日志文件位置的主从复制
- 普通素数 筛法求素数 二次筛法求素数 MillerRabin素数测试【模板】
- 一步步教你创建自己的数字货币(代币)进行ICO
热门文章
- rtx3080ti什么时候上市 rtx3080ti和RTX 3080参数对比哪个好
- 请求被pending,pending是什么意思?
- 「手机秒变照片传送门!使用 Flask 打造你的个人云相册!」
- 八路电子抢答器电路设计
- 基于协同过滤算法的在线视频学习答题自动化批改平台 习题问答系统
- 混得好的职场人的三个特质——不着急、不害怕、不要脸
- 服务器 被 上传 垃圾文件,Django:上传的文件没有被垃圾回收,导致内存问题
- Hexo博客添加自定义HTML页面
- 【Spring MVC学习笔记 六】SpringMVC框架整合AJAX完成局部刷新
- 2023智源大会议程公开丨类脑计算论坛