新聞中心
Object Relational Mapping(ORM)
成都創(chuàng)新互聯(lián)是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站模板,微信公眾號開發(fā),軟件開發(fā),小程序開發(fā),10年建站對成都混凝土泵車等多個方面,擁有多年的網(wǎng)站推廣經(jīng)驗。
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ù)庫層之間充當(dāng)了橋梁的作用。
ORM由來
讓我們從O/R開始。字母O起源于"對象"(Object),而R則來自于"關(guān)系"(Relational)。
幾乎所有的軟件開發(fā)過程中都會涉及到對象和關(guān)系數(shù)據(jù)庫。在用戶層面和業(yè)務(wù)邏輯層面,我們是面向?qū)ο蟮?。?dāng)對象的信息發(fā)生變化的時候,我們就需要把對象的信息保存在關(guān)系數(shù)據(jù)庫中。
按照之前的方式來進行開發(fā)就會出現(xiàn)程序員會在自己的業(yè)務(wù)邏輯代碼中夾雜很多SQL語句用來增加、讀取、修改、刪除相關(guān)數(shù)據(jù),而這些代碼通常都是重復(fù)的。
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ù),簡單的勞動。這是不可否認(rèn)的。
但我們不能指望某個工具能一勞永逸地解決所有問題,一些特殊問題還是需要特殊處理的。
但是在整個軟件開發(fā)過程中需要特殊處理的情況應(yīng)該都是很少的,否則所謂的工具也就失去了它存在的意義。
Django中的ORM
Django項目使用MySQL數(shù)據(jù)庫
1. 在Django項目的settings.py文件中,配置數(shù)據(jù)庫連接信息:
2. 在Django項目的__init__.py文件中寫如下代碼,告訴Django使用pymysql模塊連接MySQL數(shù)據(jù)庫:
Model
在Django中model是你數(shù)據(jù)的單一、明確的信息來源。它包含了你存儲的數(shù)據(jù)的重要字段和行為。通常,一個模型(model)映射到一個數(shù)據(jù)庫表,
基本情況:
每個模型都是一個Python類,它是django.db.models.Model的子類。
模型的每個屬性都代表一個數(shù)據(jù)庫字段。
綜上所述,Django為您提供了一個自動生成的數(shù)據(jù)庫訪問API,詳詢官方文檔鏈接。
快速入門?
下面這個例子定義了一個Person模型,包含first_name?和last_name。
first_name?和last_name是模型的字段。每個字段被指定為一個類屬性,每個屬性映射到一個數(shù)據(jù)庫列。
上面的Person模型將會像這樣創(chuàng)建一個數(shù)據(jù)庫表:
一些說明:
表myapp_person的名稱是自動生成的,如果你要自定義表名,需要在model的Meta類中指定?db_table?參數(shù),強烈建議使用小寫表名,特別是使用MySQL作為后端數(shù)據(jù)庫時。
id字段是自動添加的,如果你想要指定自定義主鍵,只需在其中一個字段中指定?primary_key=True?即可。如果Django發(fā)現(xiàn)你已經(jīng)明確地設(shè)置了Field.primary_key,它將不會添加自動ID列。
本示例中的CREATE TABLE SQL使用PostgreSQL語法進行格式化,但值得注意的是,Django會根據(jù)配置文件中指定的數(shù)據(jù)庫后端類型來生成相應(yīng)的SQL語句。
Django支持MySQL5.5及更高版本。
Django ORM 常用字段和參數(shù)
常用字段
AutoField
int自增列,必須填入?yún)?shù) primary_key=True。當(dāng)model中如果沒有自增列,則自動會創(chuàng)建一個列名為id的列。
IntegerField
一個整數(shù)類型,范圍在 -2147483648 to 2147483647。
CharField
字符類型,必須提供max_length參數(shù), max_length表示字符長度。
DateField
日期字段,日期格式? YYYY-MM-DD,相當(dāng)于Python中的datetime.date()實例。
DateTimeField
日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相當(dāng)于Python中的datetime.datetime()實例。
字段合集(爭取記憶)
自定義字段(了解為主)
自定義char類型字段
創(chuàng)建的表結(jié)構(gòu):
附ORM字段與數(shù)據(jù)庫實際字段的對應(yīng)關(guān)系
字段參數(shù)
null
用于表示某個字段可以為空。
unique
如果設(shè)置為unique=True 則該字段在此表中必須是唯一的 。
db_index
如果db_index=True 則代表著為此字段設(shè)置數(shù)據(jù)庫索引。
default
為該字段設(shè)置默認(rèn)值。
時間字段獨有
DatetimeField、DateField、TimeField這個三個時間字段,都可以設(shè)置如下屬性。
auto_now_add
配置auto_now_add=True,創(chuàng)建數(shù)據(jù)記錄的時候會把當(dāng)前時間添加到數(shù)據(jù)庫。
auto_now
配置上auto_now=True,每次更新數(shù)據(jù)記錄的時候會更新該字段。
關(guān)系字段
ForeignKey
外鍵類型在ORM中用來表示外鍵關(guān)聯(lián)關(guān)系,一般把ForeignKey字段設(shè)置在 '一對多'中'多'的一方。
ForeignKey可以和其他表做關(guān)聯(lián)關(guān)系同時也可以和自身做關(guān)聯(lián)關(guān)系。
字段參數(shù)
to
設(shè)置要關(guān)聯(lián)的表
to_field
設(shè)置要關(guān)聯(lián)的表的字段
related_name
反向操作時,使用的字段名,用于代替原反向查詢時的'表名_set'。
例如:
.
當(dāng)我們要查詢某個班級關(guān)聯(lián)的所有學(xué)生(反向查詢)時,我們會這么寫:
models.Classes.objects.first().student_set.all()
當(dāng)我們在ForeignKey字段中添加了參數(shù)?related_name?后,
當(dāng)我們要查詢某個班級關(guān)聯(lián)的所有學(xué)生(反向查詢)時,我們會這么寫:
models.Classes.objects.first().students.all()
related_query_name
反向查詢操作時,使用的連接前綴,用于替換表名。
on_delete
當(dāng)刪除關(guān)聯(lián)表中的數(shù)據(jù)時,當(dāng)前表與其關(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è)置為默認(rèn)值(前提FK字段需要設(shè)置默認(rèn)值)
models.SET
刪除關(guān)聯(lián)數(shù)據(jù),
a. 與之關(guān)聯(lián)的值設(shè)置為指定值,設(shè)置:models.SET(值)
b. 與之關(guān)聯(lián)的值設(shè)置為可執(zhí)行對象的返回值,設(shè)置:models.SET(可執(zhí)行對象)
db_constraint
是否在數(shù)據(jù)庫中創(chuàng)建外鍵約束,默認(rèn)為True。
OneToOneField
一對一字段。
通常一對一字段用來擴展已有字段。
示例
一對一的關(guān)聯(lián)關(guān)系多用在當(dāng)一張表的不同字段查詢頻次差距過大的情況下,將本可以存儲在一張表的字段拆開放置在兩張表中,然后將兩張表建立一對一的關(guān)聯(lián)關(guān)系。
字段參數(shù)
to
設(shè)置要關(guān)聯(lián)的表。
to_field
設(shè)置要關(guān)聯(lián)的字段。
on_delete
同F(xiàn)oreignKey字段。
ManyToManyField
用于表示多對多的關(guān)聯(lián)關(guān)系。在數(shù)據(jù)庫中通過第三張表來建立關(guān)聯(lián)關(guān)系。
字段參數(shù)
to
設(shè)置要關(guān)聯(lián)的表
related_name
同F(xiàn)oreignKey字段。
related_query_name
同F(xiàn)oreignKey字段。
symmetrical
僅用于多對多自關(guān)聯(lián)時,指定內(nèi)部是否創(chuàng)建反向操作的字段。默認(rèn)為True。
舉個例子:
此時,person對象就沒有person_set屬性。
此時,person對象現(xiàn)在就可以使用person_set屬性進行反向查詢。
through
在使用ManyToManyField字段時,Django將自動生成一張表來管理多對多的關(guān)聯(lián)關(guān)系。
但我們也可以手動創(chuàng)建第三張表來管理多對多關(guān)系,此時就需要通過through來指定第三張表的表名。
through_fields
設(shè)置關(guān)聯(lián)的字段。
db_table
默認(rèn)創(chuàng)建第三張表時,數(shù)據(jù)庫中表的名稱。
多對多關(guān)聯(lián)關(guān)系的三種方式?
方式一:自行創(chuàng)建第三張表
方式二:通過ManyToManyField自動創(chuàng)建第三張表
方式三:設(shè)置ManyTomanyField并指定自行創(chuàng)建的第三張表
注意:
當(dāng)我們需要在第三張關(guān)系表中存儲額外的字段時,就要使用第三種方式。
但是當(dāng)我們使用第三種方式創(chuàng)建多對多關(guān)聯(lián)關(guān)系時,就無法使用set、add、remove、clear方法來管理多對多的關(guān)系了,需要通過第三張表的model來管理多對多關(guān)系。
元信息
ORM對應(yīng)的類里面包含另一個Meta類,而Meta類封裝了一些數(shù)據(jù)庫的信息。主要字段如下:
db_table
ORM在數(shù)據(jù)庫中的表名默認(rèn)是app_類名,可以通過db_table可以重寫表名。
index_together
聯(lián)合索引。
unique_together
聯(lián)合唯一索引。
ordering
指定默認(rèn)按什么字段排序。
只有設(shè)置了該屬性,我們查詢到的結(jié)果才可以被reverse()。
分享名稱:Django中ORM介紹和字段及字段參數(shù)
轉(zhuǎn)載來于:http://fisionsoft.com.cn/article/johchh.html