ORM概念
??對象關系映射(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向對象與關系數據庫存在的互不匹配的現象的技術。
簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關系數據庫中。
ORM在業務邏輯層和數據庫層之間充當了橋梁的作用。
ORM由來
O是object,也就類對象的意思,R是relation,翻譯成中文是關系,也就是關系數據庫中數據表的意思,M是mapping,是映射的意思。在ORM框架中,它幫我們把類和數據表進行了一個映射,可以讓我們通過類和類對象就能操作它所對應的表格中的數據。ORM框架還有一個功能,它可以根據我們設計的類自動幫我們生成數據庫中的表格,省去了我們自己建表的過程。
幾乎所有的軟件開發過程中都會涉及到對象和關系數據庫。在用戶層面和業務邏輯層面,我們是面向對象的。當對象的信息發生變化的時候,我們就需要把對象的信息保存在關系數據庫中。
按照之前的方式來進行開發就會出現程序員會在自己的業務邏輯代碼中夾雜很多SQL語句用來增加、讀取、修改、刪除相關數據,而這些代碼通常都是重復的。
ORM的優劣勢
-
優勢
ORM解決的主要問題是對象和關系的映射。它通常把一個類和一個表一一對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表中的每個字段。
ORM提供了對數據庫的映射,不用直接編寫SQL代碼,只需像操作對象一樣從數據庫操作數據。
讓軟件開發人員專注于業務邏輯的處理,提高了開發效率。
-
劣勢
ORM的缺點是會在一定程度上犧牲程序的執行效率。
經常使用ORM,會退化使用SQL的技能。
Django框架中ORM示意圖
實例操作
數據庫操作
上面我們提到過,在設置中設置關聯數據庫的時候,我們寫了一個名字,但是數據庫是不會自動生成的,所以需要我們進入數據庫后,手動創建。
-
首先登錄數據庫
Selection_007.png - 創建我們在設置中所設置的數據庫名字
注意:設置字符集為utf8
更改配置
我們演示使用MySQL數據庫,這是Web項目首選的數據庫。
- 進入虛擬環境
workon book
-
然后在/Documents/project_book目錄下創建文件ORM_text。
Selection_003.png
- 進入項目文件中,創建一個應用文件booktest
cd ORM_text
python3 manage.py startappbooktest
-
在settings.py中添加應用
Selection_009.png
-
在ORM_text文件的settings.py中找到DATABASES項,其默認是使用SQLite3數據庫,現在我們要對其設置,改成mysql。
Selection_004.png
原有的設置如圖:Selection_005.png
更改成如下圖:
Selection_006.png
數據庫ORM Django框架不會自動生成,需要我們自己進入mysql數據庫去創建。
- 在虛擬環境中安裝mysql
pip install pymysql
安裝成功之后,在ORM/init.py文件中加上如下代碼:
import pymysql
pymysql.install_as_MySQLdb()
- 在ORM_text/models.py中添加我們所想要實現的類
from django.db import models
from django.db import models
#定義圖書模型類BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)#圖書名稱
bpub_date = models.DateField()#發布日期
bread = models.IntegerField(default=0)#閱讀量
bcomment = models.IntegerField(default=0)#評論量
isDelete = models.BooleanField(default=False)#邏輯刪除
#定義英雄模型類HeroInfo
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)#英雄姓名
hgender = models.BooleanField(default=True)#英雄性別
isDelete = models.BooleanField(default=False)#邏輯刪除
hcomment = models.CharField(max_length=200)#英雄描述信息
hbook = models.ForeignKey('BookInfo')#英雄與圖書表的關系為一對多,所以屬性定義在英雄模型類中
- 執行生成遷移文件和遷移
python manage.py makemigrations
python manage.py migrate
7.在數據庫中就可以看到相應的表結構
數據庫中的表名稱,是項目名稱+類名稱的小寫。
數據的操作和顯示
在數據庫的表中插入我們許要的數據
- 進入數據庫ORM然后添加book_info的內容
insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values
('射雕英雄傳','1980-5-1',12,34,0),
('天龍八部','1986-7-24',36,40,0),
('笑傲江湖','1995-12-24',20,80,0),
('雪山飛狐','1987-11-11',58,24,0);
- 添加hero_info的內容
insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values
('郭靖',1,1,'降龍十八掌',0),
('黃蓉',0,1,'打狗棍法',0),
('黃藥師',1,1,'彈指神通',0),
('歐陽鋒',1,1,'蛤蟆功',0),
('梅超風',0,1,'九陰白骨爪',0),
('喬峰',1,2,'降龍十八掌',0),
('段譽',1,2,'六脈神劍',0),
('虛竹',1,2,'天山六陽掌',0),
('王語嫣',0,2,'神仙姐姐',0),
('令狐沖',1,3,'獨孤九劍',0),
('任盈盈',0,3,'彈琴',0),
('岳不群',1,3,'華山劍法',0),
('東方不敗',0,3,'葵花寶典',0),
('胡斐',1,4,'胡家刀法',0),
('苗若蘭',0,4,'黃衣',0),
('程靈素',0,4,'醫術',0),
('袁紫衣',0,4,'六合拳',0);
- 然后我們在表中能看到相應的內容。
- 定義視圖
打開booktest/views.py文件,定義視圖代碼如下:
from django.shortcuts import render,redirect
from booktest.models import *
from datetime import date
#查詢所有圖書并顯示
def index(request):
list=BookInfo.objects.all()
return render(request,'booktest/index.html',{'list':list})
#創建新圖書
def create(request):
book=BookInfo()
book.btitle = '流星蝴蝶劍'
book.bpub_date = date(1995,12,30)
book.save()
#轉向到首頁
return redirect('/')
#邏輯刪除指定編號的圖書
def delete(request,id):
book=BookInfo.objects.get(id=int(id))
book.delete()
#轉向到首頁
return redirect('/')
- 配置url 打開ORM/urls.py文件,配置url如下:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
#引入booktest的url配置
url(r'^',include('booktest.urls')),
]
在booktest應用下創建urls.py文件。
from django.conf.urls import url
from booktest import views
urlpatterns=[
url(r'^$',views.index),
url(r'^delete(\d+)/$',views.delete),
url(r'^create/$',views.create),
]
6. 創建模板 打開ORM/settings.py文件,配置模板查找目錄TEMPLATES的DIRS。
> 'DIRS': [os.path.join(BASE_DIR,'templates')],
- 創建index.html文件。在templates/booktest/下
完成創建之后的文件列表如圖所示: