django的ORM模型的實(shí)現(xiàn)原理
ORM模型介紹
隨著項(xiàng)目越來(lái)越大,采用寫(xiě)原生SQL的方式在代碼中會(huì)出現(xiàn)大量的SQL語(yǔ)句,那么問(wèn)題就出現(xiàn)了:
- SQL語(yǔ)句重復(fù)利用率不高,越復(fù)雜的SQL語(yǔ)句條件越多,代碼越長(zhǎng)。會(huì)出現(xiàn)很多相近的SQL語(yǔ)句。
- 很多SQL語(yǔ)句是在業(yè)務(wù)邏輯中拼出來(lái)的,如果有數(shù)據(jù)庫(kù)需要更改,就要去修改這些邏輯,這會(huì)很容易漏掉對(duì)某些SQL語(yǔ)句的修改。
- 寫(xiě)SQL時(shí)容易忽略web安全問(wèn)題,給未來(lái)造成隱患。SQL注入。
ORM ,全稱 Object Relational Mapping ,中文叫做對(duì)象關(guān)系映射,通過(guò) ORM 我們可以通過(guò)類的方式去操作數(shù)據(jù)庫(kù),而不用再寫(xiě)原生的SQL語(yǔ)句。通過(guò)把表映射成類,把行作實(shí)例,把字段作為屬性, ORM 在執(zhí)行對(duì)象操作的時(shí)候最終還是會(huì)把對(duì)應(yīng)的操作轉(zhuǎn)換為數(shù)據(jù)庫(kù)原生語(yǔ)句。使用 ORM 有許多優(yōu)點(diǎn):
- 易用性:使用 ORM 做數(shù)據(jù)庫(kù)的開(kāi)發(fā)可以有效的減少重復(fù)SQL語(yǔ)句的概率,寫(xiě)出來(lái)的模型也更加直觀、清晰。
- 性能損耗小: ORM 轉(zhuǎn)換成底層數(shù)據(jù)庫(kù)操作指令確實(shí)會(huì)有一些開(kāi)銷。但從實(shí)際的情況來(lái)看,這種性能損耗很少(不足5%),只要不是對(duì)性能有嚴(yán)苛的要求,綜合考慮開(kāi)發(fā)效率、代碼的閱讀性,帶來(lái)的好處要遠(yuǎn)遠(yuǎn)大于性能損耗,而且項(xiàng)目越大作用越明顯。
- 設(shè)計(jì)靈活:可以輕松的寫(xiě)出復(fù)雜的查詢。
- 可移植性: Django 封裝了底層的數(shù)據(jù)庫(kù)實(shí)現(xiàn),支持多個(gè)關(guān)系數(shù)據(jù)庫(kù)引擎,包括流行的 MySQL 、 PostgreSQL 和 SQLite ??梢苑浅]p松的切換數(shù)據(jù)庫(kù)。
創(chuàng)建ORM模型:
ORM 模型一般都是放在 app 的 models.py 文件中。每個(gè) app 都可以擁有自己的模型。并且如果這個(gè)模型想要映射到數(shù)據(jù)庫(kù)中,那么這個(gè) app 必須要放在 settings.py 的 INSTALLED_APP 中進(jìn)行安裝。以下是寫(xiě)一個(gè)簡(jiǎn)單的書(shū)籍 ORM 模型。示例代碼如下:
from django.db import models class Book(models.Model): name = models.CharField(max_length=20,null=False) author = models.CharField(max_length=20,null=False) pub_time = models.DateTimeField(default=datetime.now) price = models.FloatField(default=0)
以上便定義了一個(gè)模型。這個(gè)模型繼承自 django.db.models.Model ,如果這個(gè)模型想要映射到數(shù)據(jù)庫(kù)中,就必須繼承自這個(gè)類。這個(gè)模型以后映射到數(shù)據(jù)庫(kù)中,表名是模型名稱的小寫(xiě)形式,為 book 。在這個(gè)表中,有四個(gè)字段,一個(gè)為 name ,這個(gè)字段是保存的是書(shū)的名稱,是 varchar 類型,最長(zhǎng)不能超過(guò)20個(gè)字符,并且不能為空。第二個(gè)字段是作者名字類型,同樣也是 varchar 類型,長(zhǎng)度不能超過(guò)20個(gè)。第三個(gè)是出版時(shí)間,數(shù)據(jù)類型是 datetime 類型,默認(rèn)是保存這本書(shū)籍的時(shí)間。第五個(gè)是這本書(shū)的價(jià)格,是浮點(diǎn)類型。
還有一個(gè)字段我們沒(méi)有寫(xiě),就是主鍵 id ,在 django 中,如果一個(gè)模型沒(méi)有定義主鍵,那么將會(huì)自動(dòng)生成一個(gè)自動(dòng)增長(zhǎng)的 int 類型的主鍵,并且這個(gè)主鍵的名字就叫做 id 。
映射模型到數(shù)據(jù)庫(kù)中:
將 ORM 模型映射到數(shù)據(jù)庫(kù)中,總結(jié)起來(lái)就是以下幾步:
- 在 settings.py 中,配置好 DATABASES ,做好數(shù)據(jù)庫(kù)相關(guān)的配置。
- 在 app 中的 models.py 中定義好模型,這個(gè)模型必須繼承自 django.db.models 。
- 將這個(gè) app 添加到 settings.py 的 INSTALLED_APP 中。
- 在命令行終端,進(jìn)入到項(xiàng)目所在的路徑,然后執(zhí)行命令 python manage.py makemigrations 來(lái)生成遷移腳本文件。
- 同樣在命令行中,執(zhí)行命令 python manage.py migrate 來(lái)將遷移腳本文件映射到數(shù)據(jù)庫(kù)中。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決python中os.system調(diào)用exe文件的問(wèn)題
這篇文章主要介紹了解決python中os.system調(diào)用exe文件的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
Pandas:DataFrame對(duì)象的基礎(chǔ)操作方法
今天小編就為大家分享一篇Pandas:DataFrame對(duì)象的基礎(chǔ)操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Using Django with GAE Python 后臺(tái)抓取多個(gè)網(wǎng)站的頁(yè)面全文
這篇文章主要介紹了Using Django with GAE Python 后臺(tái)抓取多個(gè)網(wǎng)站的頁(yè)面全文,需要的朋友可以參考下2016-02-02
python把一個(gè)字符串切開(kāi)的實(shí)例方法
在本篇文章里小編給大家整理的是一篇關(guān)于python把一個(gè)字符串切開(kāi)的實(shí)例方法,需要的朋友們可以學(xué)習(xí)參考下。2020-09-09
Pycharm2020.1安裝無(wú)法啟動(dòng)問(wèn)題即設(shè)置中文插件的方法
這篇文章主要介紹了Pycharm2020.1安裝無(wú)法啟動(dòng)問(wèn)題即設(shè)置中文插件的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-08-08
關(guān)于Python turtle庫(kù)使用時(shí)坐標(biāo)的確定方法
這篇文章主要介紹了關(guān)于Python turtle庫(kù)使用時(shí)坐標(biāo)的確定方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
python判斷列表字典字符串元組是否存在某個(gè)值或者空值(多種方法)
這篇文章主要介紹了python判斷列表字典字符串元組是否存在某個(gè)值或者空值,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-02-02
python實(shí)現(xiàn)flappy bird游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)flappy bird游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12

