ORM簡介
-
ORM概念
對象關(guān)系映射(Object Relational Mapping抽碌,簡稱ORM)模式是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)亮靴。
簡單的說掀泳,ORM是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù)未辆,將程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中蔽挠。
ORM在業(yè)務(wù)邏輯層和數(shù)據(jù)庫層之間充當了橋梁的作用
-
ORM由來
讓我們從O/R開始脖咐。字母O起源于"對象"(Object),而R則來自于"關(guān)系"(Relational)师崎。
幾乎所有的軟件開發(fā)過程中都會涉及到對象和關(guān)系數(shù)據(jù)庫默终。在用戶層面和業(yè)務(wù)邏輯層面,我們是面向?qū)ο蟮摹.攲ο蟮男畔l(fā)生變化的時候齐蔽,我們就需要把對象的信息保存在關(guān)系數(shù)據(jù)庫中两疚。
按照之前的方式來進行開發(fā)就會出現(xiàn)程序員會在自己的業(yè)務(wù)邏輯代碼中夾雜很多SQL語句用來增加、讀取含滴、修改诱渤、刪除相關(guān)數(shù)據(jù),而這些代碼通常都是重復的谈况。
-
ORM的優(yōu)勢
ORM解決的主要問題是對象和關(guān)系的映射勺美。它通常把一個類和一個表一一對應(yīng),類的每個實例對應(yīng)表中的一條記錄碑韵,類的每個屬性對應(yīng)表中的每個字段赡茸。
ORM提供了對數(shù)據(jù)庫的映射,不用直接編寫SQL代碼祝闻,只需像操作對象一樣從數(shù)據(jù)庫操作數(shù)據(jù)占卧。
讓軟件開發(fā)人員專注于業(yè)務(wù)邏輯的處理,提高了開發(fā)效率
-
ORM的劣勢
ORM的缺點是會在一定程度上犧牲程序的執(zhí)行效率联喘。
ORM用多了SQL語句就不會寫了华蜒,關(guān)系數(shù)據(jù)庫相關(guān)技能退化...
-
ORM總結(jié)
ORM只是一種工具,工具確實能解決一些重復豁遭,簡單的勞動叭喜。這是不可否認的。
但我們不能指望某個工具能一勞永逸地解決所有問題蓖谢,一些特殊問題還是需要特殊處理的捂蕴。
但是在整個軟件開發(fā)過程中需要特殊處理的情況應(yīng)該都是很少的,否則所謂的工具也就失去了它存在的意義
ORM中的Model
在Django中model是你數(shù)據(jù)的單一蜈抓、明確的信息來源启绰。它包含了你存儲的數(shù)據(jù)的重要字段和行為。通常沟使,一個模型(model)映射到一個數(shù)據(jù)庫表
每個模型都是一個Python類委可,它是django.db.models.Model的子類。
模型的每個屬性都代表一個數(shù)據(jù)庫字段
1.字段類型
from django.db import models
class Person(models.Model):
# Django會在數(shù)據(jù)庫中自動創(chuàng)建一個列名為id且自增的整數(shù)列
# 也可以自定義
# z_id = models.AutoField(primary_key=True) # 此處為自定義
name = models.CharField(max_length=10)
age = models.IntegerField()
-
主外鍵
AutoField(Field)
:int自增列腊嗡,必須填入?yún)?shù) primary_key=TrueBigAutoField(AutoField)
:bigint自增列着倾,必須填入?yún)?shù) primary_key=TrueForeignKey()
:定義外鍵OneToOneField()
:一對一字段ManyToManyField()
:多對多字段
-
數(shù)字
-
IntegerField(Field)
:整數(shù)列(有符號的) -2147483648 ~ 2147483647 -
SmallIntegerField(IntegerField)
:小整數(shù) -32768 ~ 32767 -
PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
: 正整數(shù) 0 ~ 2147483647 -
PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
:正小整數(shù) 0 ~ 32767 -
BigIntegerField(IntegerField)
:長整型(有符號的) -9223372036854775808 ~ 9223372036854775807 -
DurationField(Field)
:長整數(shù),時間間隔燕少,數(shù)據(jù)庫中按照bigint存儲卡者,ORM中獲取的值為datetime.timedelta類型 -
FloatField(Field)
:浮點型 -
DecimalField(Field)
:- 10進制小數(shù)
- 參數(shù):
- max_digits,小數(shù)總長度
- decimal_places客们,小數(shù)位長度
-
BinaryField(Field)
:二進制類型
-
-
布爾
-
BooleanField(Field)
:布爾值類型 -
NullBooleanField(Field)
:可以為空的布爾值
-
-
字符串
-
CharField(Field)
- 字符類型
- 必須提供max_length參數(shù)崇决, max_length表示字符長度
-
TextField(Field)
:文本類型 -
EmailField(CharField)
:字符串類型材诽,Django Admin以及ModelForm中提供驗證機制 -
IPAddressField(Field)
:字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制 -
GenericIPAddressField(Field)
- 字符串類型恒傻,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6
- 參數(shù):
- protocol脸侥,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
- unpack_ipv4盈厘, 如果指定為True睁枕,則輸入::ffff:192.0.2.1時候,可解析為192.0.2.1沸手,開啟刺功能外遇,需要protocol="both"
-
URLField(CharField)
:字符串類型,Django Admin以及ModelForm中提供驗證 URL -
SlugField(CharField)
:字符串類型契吉,Django Admin以及ModelForm中提供驗證支持 字母跳仿、數(shù)字、下劃線栅隐、連接符(減號) -
CommaSeparatedIntegerField(CharField)
:字符串類型塔嬉,格式必須為逗號分割的數(shù)字 -
UUIDField(Field)
:字符串類型玩徊,Django Admin以及ModelForm中提供對UUID格式的驗證 -
FilePathField(Field)
- 字符串租悄,Django Admin以及ModelForm中提供讀取文件夾下文件的功能
- 參數(shù):
- path, 文件夾路徑
- match=None, 正則匹配
- recursive=False, 遞歸下面的文件夾
- allow_files=True, 允許文件
- allow_folders=False, 允許文件夾
-
FileField(Field)
:- 字符串,路徑保存在數(shù)據(jù)庫恩袱,文件上傳到指定目錄
- 參數(shù):
- upload_to = "" 上傳文件的保存路徑
- storage = None 存儲組件泣棋,默認django.core.files.storage.FileSystemStorage
-
ImageField(FileField)
:- 字符串,路徑保存在數(shù)據(jù)庫畔塔,文件上傳到指定目錄
- 參數(shù)
- upload_to = "" 上傳文件的保存路徑
- storage = None 存儲組件潭辈,默認django.core.files.storage.FileSystemStorage
- width_field=None, 上傳圖片的高度保存的數(shù)據(jù)庫字段名(字符串)
- height_field=None 上傳圖片的寬度保存的數(shù)據(jù)庫字段名(字符串)
-
-
日期和時間
-
DateTimeField(DateField)
:日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] -
DateField(DateTimeCheckMixin, Field)
:日期格式 YYYY-MM-DD -
TimeField(DateTimeCheckMixin, Field)
:時間格式 HH:MM[:ss[.uuuuuu]]
-
2.字段參數(shù)
null
:數(shù)據(jù)庫中字段是否可以為空db_column
:數(shù)據(jù)庫中字段的列名db_tablespace
:自定義數(shù)據(jù)庫表空間的名字。默認值是工程的DEFAULT_TABLESPACE設(shè)置default
:數(shù)據(jù)庫中字段的默認值primary_key
:數(shù)據(jù)庫中字段是否為主鍵db_index
:數(shù)據(jù)庫中字段是否可以建立索引unique
:數(shù)據(jù)庫中字段是否可以建立唯一索引-
時間字段獨有
-
auto_now_add
:配置auto_now_add=True澈吨,創(chuàng)建數(shù)據(jù)記錄的時候會把當前時間添加到數(shù)據(jù)庫 -
auto_now
:配置上auto_now=True把敢,每次更新數(shù)據(jù)記錄的時候會更新該字段
-
-
ForeignKey
-
to
:設(shè)置要關(guān)聯(lián)的表 -
to_field
:設(shè)置要關(guān)聯(lián)的字段 -
related_name
:反向操作時,使用的字段名谅辣,用于代替原反向查詢時的'表名_set' -
related_query_name
:反向查詢操作時修赞,使用的連接前綴,用于替換表名 -
on_delete
:當刪除關(guān)聯(lián)表中的數(shù)據(jù)時桑阶,當前表與其關(guān)聯(lián)的行的行為-
models.CASCADE
:刪除關(guān)聯(lián)數(shù)據(jù)柏副,與之關(guān)聯(lián)也刪除 -
models.DO_NOTHING
:刪除關(guān)聯(lián)數(shù)據(jù),引發(fā)錯誤IntegrityError -
models.PROTECT
:刪除關(guān)聯(lián)數(shù)據(jù)蚣录,引發(fā)錯誤ProtectedError -
models.SET_NULL
:刪除關(guān)聯(lián)數(shù)據(jù)割择,與之關(guān)聯(lián)的值設(shè)置為null(前提FK字段需要設(shè)置為可空) -
models.SET_DEFAULT
:刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)的值設(shè)置為默認值(前提FK字段需要設(shè)置默認值) -
models.SET
:刪除關(guān)聯(lián)數(shù)據(jù)- 與之關(guān)聯(lián)的值設(shè)置為指定值萎河,設(shè)置:models.SET(值)
- 與之關(guān)聯(lián)的值設(shè)置為可執(zhí)行對象的返回值荔泳,設(shè)置:models.SET(可執(zhí)行對象)
-
-
db_constraint
:是否在數(shù)據(jù)庫中創(chuàng)建外鍵約束蕉饼,默認為True
-