Object Relational Mapping(ORM)

ORM介绍

ORM概念

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。html

简单的说,ORM是经过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。python

ORM在业务逻辑层和数据库层之间充当了桥梁的做用。mysql

ORM由来

让咱们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。程序员

几乎全部的软件开发过程当中都会涉及到对象和关系数据库。在用户层面和业务逻辑层面,咱们是面向对象的。当对象的信息发生变化的时候,咱们就须要把对象的信息保存在关系数据库中。sql

按照以前的方式来进行开发就会出现程序员会在本身的业务逻辑代码中夹杂不少SQL语句用来增长、读取、修改、删除相关数据,而这些代码一般都是极其类似或者重复的。数据库

ORM的优点

ORM解决的主要问题是对象和关系的映射。它一般将一个类和一张表一一对应,类的每一个实例对应表中的一条记录,类的每一个属性对应表中的每一个字段。 django

ORM提供了对数据库的映射,不用直接编写SQL代码,只需操做对象就能对数据库操做数据。app

让软件开发人员专一于业务逻辑的处理,提升了开发效率。工具

ORM的劣势

ORM的缺点是会在必定程度上牺牲程序的执行效率。spa

ORM的操做是有限的,也就是ORM定义好的操做是能够完成的,一些复杂的查询操做是完成不了。

ORM用多了SQL语句就不会写了,关系数据库相关技能退化...

ORM总结

ORM只是一种工具,工具确实能解决一些重复,简单的劳动。这是不能否认的。

但咱们不能期望某个工具能一劳永逸地解决全部问题,一些特殊问题仍是须要特殊处理的。

可是在整个软件开发过程当中须要特殊处理的状况应该都是不多的,不然所谓的工具也就失去了它存在的意义。

Django中的ORM

Django项目使用MySQL数据库

1. 在Django项目的settings.py文件中,配置数据库链接信息:

1
2
3
4
5
6
7
8
9
10
DATABASES  =  {
     "default" : {
         "ENGINE" "django.db.backends.mysql" ,
         "NAME" "你的数据库名称" ,   # 须要本身手动建立数据库
         "USER" "数据库用户名" ,
         "PASSWORD" "数据库密码" ,
         "HOST" "数据库IP" ,
         "POST" 3306
     }
}

2. 在与Django项目同名的目录下的__init__.py文件中写以下代码,告诉Django使用pymysql模块链接MySQL数据库:

1
2
3
import  pymysql
 
pymysql.install_as_MySQLdb()

注:数据库迁移的时候出现一个警告

WARNINGS: 
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it.

在配置中多加一个OPTIONS参数:Django官网解释

 'OPTIONS': {
    'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},

Model

在Django中model是你数据的单1、明确的信息来源。它包含了你存储的数据的重要字段和行为。一般,一个模型(model)映射到一个数据库表。

基本状况:

  • 每一个模型都是一个Python类,它是django.db.models.Model的子类。
  • 模型的每一个属性都表明一个数据库字段。
  • 综上所述,Django为您提供了一个自动生成的数据库访问API,详询官方文档连接

快速入门 

下面这个例子定义了一个 Person 模型,包含 first_name 和 last_name

1
2
3
4
5
from  django.db  import  models
 
class  Person(models.Model):
     first_name  =  models.CharField(max_length = 30 )
     last_name  =  models.CharField(max_length = 30 )

first_name 和 last_name 是模型的字段。每一个字段被指定为一个类属性,每一个属性映射到一个数据库列。

上面的 Person 模型将会像这样建立一个数据库表:

1
2
3
4
5
CREATE  TABLE  myapp_person (
     "id"  serial  NOT  NULL  PRIMARY  KEY ,
     "first_name"  varchar (30)  NOT  NULL ,
     "last_name"  varchar (30)  NOT  NULL
);

一些说明:

  • 表myapp_person的名称是自动生成的,若是你要自定义表名,须要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL做为数据库时。
  • id字段是自动添加的,若是你想要指定自定义主键,只需在其中一个字段中指定 primary_key=True 便可。若是Django发现你已经明确地设置了Field.primary_key,它将不会添加自动ID列。
  • 本示例中的CREATE TABLE SQL使用PostgreSQL语法进行格式化,但值得注意的是,Django会根据配置文件中指定的数据库类型来生成相应的SQL语句。
  • Django支持MySQL5.5及更高版本。

字段 

经常使用字段 

AutoField

自增的整形字段,必填参数primary_key=True,则成为数据库的主键。无该字段时,django自动建立。

一个model不能有两个AutoField字段。

IntegerField

一个整数类型。数值的范围是 -2147483648 ~ 2147483647。

CharField

字符类型,必须提供max_length参数。max_length表示字符的长度。

DateField

日期类型,日期格式为YYYY-MM-DD,至关于Python中的datetime.date的实例。

参数:

  • auto_now:每次修改时修改成当前日期时间。
  • auto_now_add:新建立对象时自动添加当前日期时间。

auto_now和auto_now_add和default参数是互斥的,不能同时设置。

DatetimeField

日期时间字段,格式为YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],至关于Python中的datetime.datetime的实例。

字段类型,详情可点击查询官网

  字段类型

自定义字段

自定义一个二进制字段,以及Django字段与数据库字段类型的对应关系。

  View Code

自定义一个char类型字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
class  MyCharField(models.Field):
     """
     自定义的char类型的字段类
     """
     def  __init__( self , max_length,  * args,  * * kwargs):
         self .max_length  =  max_length
         super (MyCharField,  self ).__init__(max_length = max_length,  * args,  * * kwargs)
 
     def  db_type( self , connection):
         """
         限定生成数据库表的字段类型为char,长度为max_length指定的值
         """
         return  'char(%s)'  %  self .max_length
使用自定义char类型字段:
1
2
3
4
5
class  Class(models.Model):
     id  =  models.AutoField(primary_key = True )
     title  =  models.CharField(max_length = 25 )
     # 使用自定义的char类型的字段
     cname  =  MyCharField(max_length = 25 )

建立的表结构:

字段参数

字段参数,详情可点击查看官网

Model Meta参数

这个不是很经常使用,若是你有特殊须要可使用。详情点击查看官网

多表关系和参数

ORM操做

基本操做

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 增
models.Tb1.objects.create(c1 = 'xx' , c2 = 'oo' )    # 增长一条数据,能够接受字典类型数据 **kwargs
obj  =  models.Tb1(c1 = 'xx' , c2 = 'oo' )
obj.save()
 
 
# 查
models.Tb1.objects.get( id = 123 )   # 获取单条数据,不存在则报错(不建议)
models.Tb1.objects. all ()   # 获取所有
models.Tb1.objects. filter (name = 'seven' )   # 获取指定条件的数据
models.Tb1.objects.exclude(name = 'seven' )   # 去除指定条件的数据
 
 
# 删
# models.Tb1.objects.filter(name='seven').delete()  # 删除指定条件的数据
 
 
# 改
models.Tb1.objects. filter (name = 'seven' ).update(gender = '0' )    # 将指定条件的数据更新,均支持 **kwargs
obj  =  models.Tb1.objects.get( id = 1 )
obj.c1  =  '111'
obj.save()    # 修改单条数据

进阶操做

  进阶操做

高级操做

  高级操做

QuerySet相关方法

  QuerySet方法大全
相关文章
相关标签/搜索