对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。html
简单的说,ORM是经过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。python
ORM在业务逻辑层和数据库层之间充当了桥梁的做用。mysql
让咱们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。程序员
几乎全部的软件开发过程当中都会涉及到对象和关系数据库。在用户层面和业务逻辑层面,咱们是面向对象的。当对象的信息发生变化的时候,咱们就须要把对象的信息保存在关系数据库中。sql
按照以前的方式来进行开发就会出现程序员会在本身的业务逻辑代码中夹杂不少SQL语句用来增长、读取、修改、删除相关数据,而这些代码一般都是极其类似或者重复的。数据库
ORM解决的主要问题是对象和关系的映射。它一般将一个类和一张表一一对应,类的每一个实例对应表中的一条记录,类的每一个属性对应表中的每一个字段。 django
ORM提供了对数据库的映射,不用直接编写SQL代码,只需操做对象就能对数据库操做数据。app
让软件开发人员专一于业务逻辑的处理,提升了开发效率。工具
ORM的缺点是会在必定程度上牺牲程序的执行效率。spa
ORM的操做是有限的,也就是ORM定义好的操做是能够完成的,一些复杂的查询操做是完成不了。
ORM用多了SQL语句就不会写了,关系数据库相关技能退化...
ORM只是一种工具,工具确实能解决一些重复,简单的劳动。这是不能否认的。
但咱们不能期望某个工具能一劳永逸地解决全部问题,一些特殊问题仍是须要特殊处理的。
可是在整个软件开发过程当中须要特殊处理的状况应该都是不多的,不然所谓的工具也就失去了它存在的意义。
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'"},
在Django中model是你数据的单1、明确的信息来源。它包含了你存储的数据的重要字段和行为。一般,一个模型(model)映射到一个数据库表。
基本状况:
下面这个例子定义了一个 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
);
|
一些说明:
经常使用字段
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和default参数是互斥的,不能同时设置。
DatetimeField
日期时间字段,格式为YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],至关于Python中的datetime.datetime的实例。
字段类型,详情可点击查询官网。
自定义一个二进制字段,以及Django字段与数据库字段类型的对应关系。
自定义一个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
|
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
)
|
建立的表结构:
字段参数,详情可点击查看官网。
这个不是很经常使用,若是你有特殊须要可使用。详情点击查看官网。
基本操做
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相关方法