午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

第一章:模型層model layer

 寧?kù)o致遠(yuǎn)oj1kn5 2019-05-17

該系列教程系個(gè)人原創(chuàng),并完整發(fā)布在個(gè)人官網(wǎng)劉江的博客和教程

所有轉(zhuǎn)載本文者,需在頂部顯著位置注明原作者及www.官網(wǎng)地址。


題外話:

Django的教程寫到這里,就進(jìn)入了整體的第二部分,也是最關(guān)鍵的部分。此時(shí)有一個(gè)問(wèn)題必須想清楚,那就是,以項(xiàng)目帶動(dòng)內(nèi)容還是以參考書目的方式展開(kāi)?為此,我考慮了很久。

我在開(kāi)始學(xué)習(xí)Django的時(shí)候,也看過(guò)許多教程和博客,有的專述某個(gè)細(xì)節(jié),雖然比較深入,但不夠全面;有的比較泛泛但不夠深入。有的以項(xiàng)目帶動(dòng),簡(jiǎn)單易懂,可以跟著一步步做,但做完了,只學(xué)到作者的幾個(gè)小技巧,對(duì)Django仍然是一知半解。都知道用Django的ORM可以方便的操作數(shù)據(jù)庫(kù),但你知道Django有幾種數(shù)據(jù)庫(kù)API么?都知道模板過(guò)濾器很有幫助,但你都用過(guò)么,是不是只會(huì)大小寫轉(zhuǎn)換?

項(xiàng)目實(shí)戰(zhàn)當(dāng)然重要,但是全面完善的內(nèi)容介紹能給你更多的幫助。參考書式的講解,可能比較晦澀,但絕對(duì)是你入門之后,最好的幫手,我們可以時(shí)不時(shí),在需要的情況下,回頭再翻翻,然后恍然大悟,原來(lái)Django本身就有這個(gè)功能,根本不需要自己實(shí)現(xiàn)。畢竟我們學(xué)習(xí)Django不是學(xué)習(xí)如何開(kāi)發(fā)Web框架,而是學(xué)習(xí)Web框架本身提供給你的功能,如果連Django提供的現(xiàn)成功能都不能夠了解齊全,還談什么二次開(kāi)發(fā)?

當(dāng)然,項(xiàng)目實(shí)戰(zhàn)也必須有,但這就是教程的第三部分內(nèi)容了。

基調(diào)已定,那么為了保證內(nèi)容的全面、準(zhǔn)確和權(quán)威性,本部分內(nèi)容以Django官方文檔為依據(jù),加以適當(dāng)調(diào)整和修飾。

以上??!


回到我們的主題--模型層。

在MVC或者說(shuō)MTV設(shè)計(jì)模式中,模型(M)代表對(duì)數(shù)據(jù)庫(kù)的操作。那么如何操作數(shù)據(jù)庫(kù)呢?

手動(dòng)切換到數(shù)據(jù)庫(kù)環(huán)境,然后敲入SQL語(yǔ)句?你知道這是個(gè)笑話!

我們是程序員,講的是自動(dòng)化,實(shí)現(xiàn)的是Python環(huán)境下的操作,所以我們必然是通過(guò)寫Python代碼的方式。可是....Python和數(shù)據(jù)庫(kù)語(yǔ)言SQL是兩碼事啊,它根本操作不了數(shù)據(jù)庫(kù)!沒(méi)關(guān)系,我們可以在Python代碼中嵌入SQL語(yǔ)句,比如下面的方式:

# 創(chuàng)建連接,這里先忽略創(chuàng)建方法
conn = ......
# 創(chuàng)建游標(biāo)
cursor = conn.cursor()

# 執(zhí)行SQL,并返回收影響行數(shù)
effect_row = cursor.execute("insert into host (hostname,port,ip) values('ubuntu','22','10.0.0.2');")

# 提交,不然無(wú)法保存新建或者修改的數(shù)據(jù)
conn.commit()

# 關(guān)閉游標(biāo)
cursor.close()
# 關(guān)閉連接
conn.close()

但是問(wèn)題又來(lái)了,Python怎么創(chuàng)建和數(shù)據(jù)庫(kù)的連接呢?或者更直白的說(shuō)Python怎么連接數(shù)據(jù)庫(kù)呢?可以使用類似pymysql這一類的第三方模塊(針對(duì)不同的數(shù)據(jù)庫(kù),有不同的模塊)。于是我們可以進(jìn)行如下的連接:

conn = pymysql.connect(host='137.78.5.130', port=3306, user='root', passwd='123456', db='test')

好了,這樣似乎就Ok了。但是,如果你有很多的數(shù)據(jù)庫(kù)操作,并且你的Python程序員不是專業(yè)的DBA,寫的SQL語(yǔ)句很爛,甚至經(jīng)常寫錯(cuò),怎么辦?

聰明的人想出了一個(gè)辦法:用Python語(yǔ)法來(lái)寫,然后使用一個(gè)中間工具將Python代碼翻譯成原生的SQL語(yǔ)句,這樣你總不會(huì)寫錯(cuò)了吧?這個(gè)中間工具就是所謂的ORM(對(duì)象關(guān)系映射)!

ORM將一個(gè)Python的對(duì)象映射為數(shù)據(jù)庫(kù)中的一張關(guān)系表。它將SQL封裝起來(lái),程序員不再需要關(guān)心數(shù)據(jù)庫(kù)的具體操作,只需要專注于自己本身代碼和業(yè)務(wù)邏輯的實(shí)現(xiàn)。

于是,整體的實(shí)現(xiàn)過(guò)程就是:Python代碼,通過(guò)ORM轉(zhuǎn)換成SQL語(yǔ)句,再通過(guò)pymysql去實(shí)際操作數(shù)據(jù)庫(kù)。

image.png-18.7kB

最典型的ORM就是SQLAlchemy了,如果你的Web框架自身不帶ORM系統(tǒng),那么你可以安裝使用它,SQLAlchemy使用者還是比較多的,本身功能也比較強(qiáng)大,大家可以自行學(xué)習(xí)。

image.png-245kB


Django自帶ORM系統(tǒng),不需要額外安裝別的ORM。當(dāng)然,也可以安裝并使用其它的ORM,比如SQLAlchemy,但是不建議這么做,因?yàn)镈jango系統(tǒng)龐大,集成完善,模型層與視圖層、模板層結(jié)合得比較緊密,使用自帶的ORM更方便更可靠,并且Django自帶的ORM功能也非常強(qiáng)大,也不難學(xué)。

Django的ORM系統(tǒng)體現(xiàn)在框架內(nèi)就是模型層。想要理解模型層的概念,關(guān)鍵在于理解用Python代碼的方式來(lái)定義數(shù)據(jù)庫(kù)表的做法!一個(gè)Python的類,就是一個(gè)模型,代表數(shù)據(jù)庫(kù)中的一張數(shù)據(jù)表!Django奉行Python優(yōu)先的原則,一切基于Python代碼的交流,完全封裝SQL內(nèi)部細(xì)節(jié)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多