Object Relational Mapping(ORM)

ORM介紹

ORM概念

對象關係映射(Object Relational Mapping,簡稱ORM)模式是一種爲了解決面向對象與關係數據庫存在的互不匹配的現象的技術。html

簡單的說,ORM是經過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關係數據庫中。python

ORM在業務邏輯層和數據庫層之間充當了橋樑的做用。mysql

ORM由來

讓咱們從O/R開始。字母O起源於"對象"(Object),而R則來自於"關係"(Relational)。程序員

幾乎全部的軟件開發過程當中都會涉及到對象和關係數據庫。在用戶層面和業務邏輯層面,咱們是面向對象的。當對象的信息發生變化的時候,咱們就須要把對象的信息保存在關係數據庫中。sql

按照以前的方式來進行開發就會出現程序員會在本身的業務邏輯代碼中夾雜不少SQL語句用來增長、讀取、修改、刪除相關數據,而這些代碼一般都是極其類似或者重複的。數據庫

ORM的優點

ORM解決的主要問題是對象和關係的映射。它一般將一個類和一張表一一對應,類的每一個實例對應表中的一條記錄,類的每一個屬性對應表中的每一個字段。 django

ORM提供了對數據庫的映射,不用直接編寫SQL代碼,只需操做對象就能對數據庫操做數據。app

讓軟件開發人員專一於業務邏輯的處理,提升了開發效率。工具

ORM的劣勢

ORM的缺點是會在必定程度上犧牲程序的執行效率。spa

ORM的操做是有限的,也就是ORM定義好的操做是能夠完成的,一些複雜的查詢操做是完成不了。

ORM用多了SQL語句就不會寫了,關係數據庫相關技能退化...

ORM總結

ORM只是一種工具,工具確實能解決一些重複,簡單的勞動。這是不能否認的。

但咱們不能期望某個工具能一勞永逸地解決全部問題,一些特殊問題仍是須要特殊處理的。

可是在整個軟件開發過程當中須要特殊處理的狀況應該都是不多的,不然所謂的工具也就失去了它存在的意義。

Django中的ORM

Django項目使用MySQL數據庫

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'"},

Model

在Django中model是你數據的單1、明確的信息來源。它包含了你存儲的數據的重要字段和行爲。一般,一個模型(model)映射到一個數據庫表。

基本狀況:

  • 每一個模型都是一個Python類,它是django.db.models.Model的子類。
  • 模型的每一個屬性都表明一個數據庫字段。
  • 綜上所述,Django爲您提供了一個自動生成的數據庫訪問API,詳詢官方文檔連接

快速入門 

下面這個例子定義了一個 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
);

一些說明:

  • 表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及更高版本。

字段 

經常使用字段 

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:新建立對象時自動添加當前日期時間。

auto_now和auto_now_add和default參數是互斥的,不能同時設置。

DatetimeField

日期時間字段,格式爲YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],至關於Python中的datetime.datetime的實例。

字段類型,詳情可點擊查詢官網

  字段類型

自定義字段

自定義一個二進制字段,以及Django字段與數據庫字段類型的對應關係。

  View Code

自定義一個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
使用自定義char類型字段:
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 )

建立的表結構:

字段參數

字段參數,詳情可點擊查看官網

Model Meta參數

這個不是很經常使用,若是你有特殊須要可使用。詳情點擊查看官網

多表關係和參數

ORM操做

基本操做

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相關方法

  QuerySet方法大全
相關文章
相關標籤/搜索