您好,登錄后才能下訂單哦!
Object Relational Mapping(ORM)
ORM介紹
ORM概念
對象關系映射(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向對象與關系數據庫存在的互不匹配的現象的技術。
簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關系數據庫中。
ORM在業務邏輯層和數據庫層之間充當了橋梁的作用。
ORM由來
讓我們從O/R開始。字母O起源于"對象"(Object),而R則來自于"關系"(Relational)。
幾乎所有的軟件開發過程中都會涉及到對象和關系數據庫。在用戶層面和業務邏輯層面,我們是面向對象的。當對象的信息發生變化的時候,我們就需要把對象的信息保存在關系數據庫中。
按照之前的方式來進行開發就會出現程序員會在自己的業務邏輯代碼中夾雜很多SQL語句用來增加、讀取、修改、刪除相關數據,而這些代碼通常都是重復的。
ORM的優勢
ORM解決的主要問題是對象和關系的映射。它通常把一個類和一個表一一對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表中的每個字段。?
ORM提供了對數據庫的映射,不用直接編寫SQL代碼,只需像操作對象一樣從數據庫操作數據。
讓軟件開發人員專注于業務邏輯的處理,提高了開發效率。
ORM的劣勢
ORM的缺點是會在一定程度上犧牲程序的執行效率。
ORM用多了SQL語句就不會寫了,關系數據庫相關技能退化...
ORM總結
ORM只是一種工具,工具確實能解決一些重復,簡單的勞動。這是不可否認的。
但我們不能指望某個工具能一勞永逸地解決所有問題,一些特殊問題還是需要特殊處理的。
但是在整個軟件開發過程中需要特殊處理的情況應該都是很少的,否則所謂的工具也就失去了它存在的意義。
Django中的ORM
Django項目使用MySQL數據庫
1. 在Django項目的settings.py文件中,配置數據庫連接信息:
2. 在Django項目的__init__.py文件中寫如下代碼,告訴Django使用pymysql模塊連接MySQL數據庫:
Model
在Django中model是你數據的單一、明確的信息來源。它包含了你存儲的數據的重要字段和行為。通常,一個模型(model)映射到一個數據庫表,
基本情況:
每個模型都是一個Python類,它是django.db.models.Model的子類。
模型的每個屬性都代表一個數據庫字段。
綜上所述,Django為您提供了一個自動生成的數據庫訪問API,詳詢官方文檔鏈接。
快速入門?
下面這個例子定義了一個Person模型,包含first_name?和last_name。
first_name?和last_name是模型的字段。每個字段被指定為一個類屬性,每個屬性映射到一個數據庫列。
上面的Person模型將會像這樣創建一個數據庫表:
一些說明:
表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及更高版本。
Django ORM 常用字段和參數
常用字段
AutoField
int自增列,必須填入參數 primary_key=True。當model中如果沒有自增列,則自動會創建一個列名為id的列。
IntegerField
一個整數類型,范圍在 -2147483648 to 2147483647。
CharField
字符類型,必須提供max_length參數, max_length表示字符長度。
DateField
日期字段,日期格式? YYYY-MM-DD,相當于Python中的datetime.date()實例。
DateTimeField
日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相當于Python中的datetime.datetime()實例。
字段合集(爭取記憶)
自定義字段(了解為主)
自定義char類型字段
創建的表結構:
附ORM字段與數據庫實際字段的對應關系
字段參數
null
用于表示某個字段可以為空。
unique
如果設置為unique=True 則該字段在此表中必須是唯一的 。
db_index
如果db_index=True 則代表著為此字段設置數據庫索引。
default
為該字段設置默認值。
時間字段獨有
DatetimeField、DateField、TimeField這個三個時間字段,都可以設置如下屬性。
auto_now_add
配置auto_now_add=True,創建數據記錄的時候會把當前時間添加到數據庫。
auto_now
配置上auto_now=True,每次更新數據記錄的時候會更新該字段。
關系字段
ForeignKey
外鍵類型在ORM中用來表示外鍵關聯關系,一般把ForeignKey字段設置在 '一對多'中'多'的一方。
ForeignKey可以和其他表做關聯關系同時也可以和自身做關聯關系。
字段參數
to
設置要關聯的表
to_field
設置要關聯的表的字段
related_name
反向操作時,使用的字段名,用于代替原反向查詢時的'表名_set'。
例如:
.
當我們要查詢某個班級關聯的所有學生(反向查詢)時,我們會這么寫:
models.Classes.objects.first().student_set.all()
當我們在ForeignKey字段中添加了參數?related_name?后,
當我們要查詢某個班級關聯的所有學生(反向查詢)時,我們會這么寫:
models.Classes.objects.first().students.all()
related_query_name
反向查詢操作時,使用的連接前綴,用于替換表名。
on_delete
當刪除關聯表中的數據時,當前表與其關聯的行的行為。
models.CASCADE
刪除關聯數據,與之關聯也刪除
models.DO_NOTHING
刪除關聯數據,引發錯誤IntegrityError
models.PROTECT
刪除關聯數據,引發錯誤ProtectedError
models.SET_NULL
刪除關聯數據,與之關聯的值設置為null(前提FK字段需要設置為可空)
models.SET_DEFAULT
刪除關聯數據,與之關聯的值設置為默認值(前提FK字段需要設置默認值)
models.SET
刪除關聯數據,
a. 與之關聯的值設置為指定值,設置:models.SET(值)
b. 與之關聯的值設置為可執行對象的返回值,設置:models.SET(可執行對象)
db_constraint
是否在數據庫中創建外鍵約束,默認為True。
OneToOneField
一對一字段。
通常一對一字段用來擴展已有字段。
示例
一對一的關聯關系多用在當一張表的不同字段查詢頻次差距過大的情況下,將本可以存儲在一張表的字段拆開放置在兩張表中,然后將兩張表建立一對一的關聯關系。
字段參數
to
設置要關聯的表。
to_field
設置要關聯的字段。
on_delete
同ForeignKey字段。
ManyToManyField
用于表示多對多的關聯關系。在數據庫中通過第三張表來建立關聯關系。
字段參數
to
設置要關聯的表
related_name
同ForeignKey字段。
related_query_name
同ForeignKey字段。
symmetrical
僅用于多對多自關聯時,指定內部是否創建反向操作的字段。默認為True。
舉個例子:
此時,person對象就沒有person_set屬性。
此時,person對象現在就可以使用person_set屬性進行反向查詢。
through
在使用ManyToManyField字段時,Django將自動生成一張表來管理多對多的關聯關系。
但我們也可以手動創建第三張表來管理多對多關系,此時就需要通過through來指定第三張表的表名。
through_fields
設置關聯的字段。
db_table
默認創建第三張表時,數據庫中表的名稱。
多對多關聯關系的三種方式?
方式一:自行創建第三張表
方式二:通過ManyToManyField自動創建第三張表
方式三:設置ManyTomanyField并指定自行創建的第三張表
注意:
當我們需要在第三張關系表中存儲額外的字段時,就要使用第三種方式。
但是當我們使用第三種方式創建多對多關聯關系時,就無法使用set、add、remove、clear方法來管理多對多的關系了,需要通過第三張表的model來管理多對多關系。
元信息
ORM對應的類里面包含另一個Meta類,而Meta類封裝了一些數據庫的信息。主要字段如下:
db_table
ORM在數據庫中的表名默認是app_類名,可以通過db_table可以重寫表名。
index_together
聯合索引。
unique_together
聯合唯一索引。
ordering
指定默認按什么字段排序。
只有設置了該屬性,我們查詢到的結果才可以被reverse()。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。