對象關係映射(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相關方法