一. ORM简介

1. web开发的分工模式

  1. DBA(数据库管理员)+应用层开发。

    一般中大型公司(或者数据量巨大、读取数据的需求频繁并且追求极致效率的公司)会有专门的DBA管理数据库,编写sql语句,对于应用层开发来说,不用写sql语句,直接调用他写的接口就行。所以在这种公司一般来说,开发人员应该'供'着DBA,因为你想写入或者取出的数据需要依赖于DBA去执行,或者是你写的比较复杂的sql语句需要让DBA帮你看一下,效率行不行、是不是需要优化等等,这就需要看你们的交情或者其心情了。哈哈(开个玩笑)。

  2. 应用程序开发+sql语句编写。

    这种情况多存在于小公司,没有专门设置DBA岗位,要求开发人员什么都会一些,linux、数据库、前端等等,这样成本降低并且减少由于部门之间的沟通带来的损失,提高工作流程效率。

  3. 应用程序开发+ORM。

    这种模式sql不用你写,你直接写类、对象,应为你对这些更加游刃有余。然后通过你写的类、对象,等等通过相应的转换关系直接转化成对应的原生sql语句,这种转化关系就是ORM:对象-关系-映射。你直接写一个类就是创建一张表,你实例化一个对象就是增加一条数据,这样以来,既可以避开写sql语句的麻烦,而且可以提升我们的开发效率。

2. ORM

  • MTV或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动.
  • ORM是“对象-关系-映射”的简称。(Object Relational Mapping,简称ORM)(将来会学一个sqlalchemy,是和他很像的,但是django的orm没有独立出来让别人去使用,虽然功能比sqlalchemy更强大,但是别人用不了)
  • 类对象--->sql--->pymysql--->mysql服务端--->磁盘,orm其实就是将类对象的语法翻译成sql语句的一个引擎,明白orm是什么了,剩下的就是怎么使用orm,怎么来写类对象关系语句。

这样开发效率肯定是提升了,但是也有一点点缺陷就是通过ORM转化成的sql语句虽然是准确的,但是不一定是最优的。

 Django基础之:ORM系统 单表操作

  原生sql和python的orm代码对比

Django基础之:ORM系统 单表操作
#sql中的表                                                      

 #创建表:
     CREATE TABLE employee(                                     
                id INT PRIMARY KEY auto_increment ,                    
                name VARCHAR (20),                                      
                gender BIT default 1,                                  
                birthday DATA ,                                         
                department VARCHAR (20),                                
                salary DECIMAL (8,2) unsigned,                          
              );


  #sql中的表纪录                                                  

  #添加一条表纪录:                                                          
      INSERT employee (name,gender,birthday,salary,department)            
             VALUES   ("alex",1,"1985-12-12",8000,"保洁部");               

  #查询一条表纪录:                                                           
      SELECT * FROM employee WHERE age=24;                               

  #更新一条表纪录:                                                           
      UPDATE employee SET birthday="1989-10-24" WHERE id=1;              

  #删除一条表纪录:                                                          
      DELETE FROM employee WHERE name="alex"                             





#python的类
class Employee(models.Model):
     id=models.AutoField(primary_key=True)
     name=models.CharField(max_length=32)
     gender=models.BooleanField()
     birthday=models.DateField()
     department=models.CharField(max_length=32)
     salary=models.DecimalField(max_digits=8,decimal_places=2)


 #python的类对象
      #添加一条表纪录:
          emp=Employee(name="alex",gender=True,birthday="1985-12-12",epartment="保洁部")
          emp.save()
      #查询一条表纪录:
          Employee.objects.filter(age=24)
      #更新一条表纪录:
          Employee.objects.filter(id=1).update(birthday="1989-10-24")
      #删除一条表纪录:
          Employee.objects.filter(name="alex").delete()
Django基础之:ORM系统 单表操作

二、单表操作

1.创建表

1. 首先我们先创建一个ORM项目

在你的app01项目中models就是以后我们创建数据模型的地方。

Django基础之:ORM系统 单表操作

2. 通过类创建数据表

从django.db 引入models模块,创建表通过构建一个类去设定,数据库中不区分大小写,所以你的UserInfo在数据库中直接编译成了userinfo,此类必须继承models.Model类,通过设定类的静态属性就会转化成sql语句。

from django.db import models
# Create your models here.


class UserInfo(models.Model):
    """
    下面几个类的属性通过ORM映射就对应成了:
    create table userinfo(
        id int primary key auto_increment,
        name varchar(16),
        age int,
        current_date date)
    """
    id = models.AutoField(primary_key=True)

    name = models.CharField(max_length=16)

    age = models.IntegerField()

    current_date = models.DateField()

3. 在对应的数据库中生成表结构

上面我们已经通过类构建了一个表,但是还没有对应的生成真实的数据库中的表结构,所以我们要将上面的类生成真生的数据库中的表结构。对应只有行代码。

在terminal输入指令:

python manage.py makemigrations

Django基础之:ORM系统 单表操作

我这里使用的是python3.6 是因为python版本较多,环境变量python3.6指向的是python3.6.8的解释器。

然后你看你的app01下面的migrations出现一个0001_initial.py的文件,这个文件是你执行了上述指令之后产生的脚本文件,这个文件就是一个记录。

接下来我们继续输入指令:

python manage.py migrate

这个指令其实就是执行第一个指令生成的记录也就是那个脚本文件,然后就会在你对应的数据库中生成一个真正的表,生成的表名字前面会自带应用的名字,例如:你的userinfo表在数据表里面叫做:app01_userinfo。

在执行 python manager.py makemigrations时
Django 会在相应的 app 的migrations文件夹下面生成 一个python脚本文件 
    
在执行 python manager.py migrate 时 Django才会生成数据库表,那么Django是如何生成数据库表的呢?

Django是根据 migrations下面的脚本文件来生成数据表的
    每个migrations文件夹下面有多个脚本,那么django是如何知道该执行那个文件的呢,django有一张django-migrations表,表中记录了已经执行的脚本,那么表中没有的就是还没执行的脚本,则 执行migrate的时候就只执行表中没有记录的那些脚本。
    有时在执行 migrate 的时候如果发现没有生成相应的表,可以看看在 django-migrations表中看看 脚本是否已经执行了,
    可以删除 django-migrations 表中的记录 和 数据库中相应的 表 , 然后重新 执行
同步执行指令的原理

相关文章: