国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

掌握Python設(shè)計模式,SQL Alchemy打破ORM與模型類的束縛

這篇具有很好參考價值的文章主要介紹了掌握Python設(shè)計模式,SQL Alchemy打破ORM與模型類的束縛。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

大家好,反轉(zhuǎn)軟件組件之間的依賴關(guān)系之所以重要,是因為它有助于降低耦合度和提高模塊化程度,進而可以提高軟件的可維護性、可擴展性和可測試性。

當(dāng)組件之間緊密耦合時,對一個組件的更改可能會對其他組件產(chǎn)生意想不到的影響,從而導(dǎo)致整個系統(tǒng)中的連鎖更改效應(yīng)。通過反轉(zhuǎn)依賴關(guān)系,可以確保組件僅依賴于抽象而不是具體實現(xiàn)來減輕這個問題。

就ORM和模型類而言,反轉(zhuǎn)依賴關(guān)系允許ORM和模型類相互獨立地發(fā)展,有助于使代碼更加模塊化、更具可維護性。例如,如果數(shù)據(jù)庫模式發(fā)生更改,可以更新ORM以反映新的模式,而無需修改模型類。同樣,如果想切換到不同的ORM,我們也可以這樣做,而無需修改模型類。

此外,反轉(zhuǎn)依賴關(guān)系還允許對每個組件進行單獨測試,從而使代碼更具可測試性。例如,可以為模型類編寫單元測試,而無需設(shè)置數(shù)據(jù)庫連接,因為模型類并不依賴于ORM。同樣可以為ORM編寫集成測試,而無需實例化模型類,因為ORM僅依賴于模型類的抽象。

1.代碼示例

以下是一個使用Python中的SQLAlchemy反轉(zhuǎn)ORM和模型類之間依賴關(guān)系的示例。首先使用元數(shù)據(jù)定義模式,然后定義模型類,最后使用映射器和關(guān)系設(shè)置ORM。

from?sqlalchemy?import?create_engine,?Column,?Integer,?String,?ForeignKey
from?sqlalchemy.orm?import?sessionmaker,?relationship,?mapper
from?sqlalchemy.ext.declarative?import?declarative_base,?declared_attr
from?sqlalchemy.schema?import?MetaData

#?使用元數(shù)據(jù)定義模式
metadata?=?MetaData()

class?UserTable:
????@declared_attr
????def?__tablename__(cls):
????????return?cls.__name__.lower()?+?'s'

????id?=?Column(Integer,?primary_key=True)
????name?=?Column(String)
????email?=?Column(String,?unique=True)

class?PostTable:
????@declared_attr
????def?__tablename__(cls):
????????return?cls.__name__.lower()?+?'s'

????id?=?Column(Integer,?primary_key=True)
????title?=?Column(String)
????content?=?Column(String)
????user_id?=?Column(Integer,?ForeignKey('users.id'))

#?定義模型類
class?User:
????def?__init__(self,?name,?email):
????????self.name?=?name
????????self.email?=?email

class?Post:
????def?__init__(self,?title,?content,?author):
????????self.title?=?title
????????self.content?=?content
????????self.author?=?author

#?使用映射器和關(guān)系設(shè)置ORM
engine?=?create_engine('sqlite:///example.db')
Session?=?sessionmaker(bind=engine)
Base?=?declarative_base()

class?UserORM(Base,?UserTable):
????@property
????def?model(self):
????????return?User(self.name,?self.email)

class?PostORM(Base,?PostTable):
????@property
????def?model(self):
????????return?Post(self.title,?self.content,?self.author.model)

????author?=?relationship(UserORM,?backref='posts')

Base.metadata.create_all(engine)

#?在應(yīng)用程序中使用ORM和模型類
session?=?Session()


#?創(chuàng)建一些用戶和帖子
user1?=?UserORM(name='Alice',?email='alice@example.com')
user2?=?UserORM(name='Bob',?email='bob@example.com')

post1?=?PostORM(title='My?first?post',?content='Hello,?world!',?author=user1)
post2?=?PostORM(title='Another?post',?content='This?is?a?test',?author=user2)

#?將用戶和帖子保存到數(shù)據(jù)庫
session.add(user1)
session.add(user2)

session.add(post1)
session.add(post2)

session.commit()

#?通過電子郵件地址檢索用戶
user?=?session.query(UserORM).filter_by(email='alice@example.com').one()
print(user.model.name)??#?打印出?"Alice"

#?檢索用戶的帖子
for?post?in?user.posts:
????print(post.model.title)??#?打印出?"My?first?post"

在這段代碼中,首先使用元數(shù)據(jù)定義了模式,并為數(shù)據(jù)庫中的每個表定義了單獨的類。然后定義模型類UserPost,它們與相應(yīng)的數(shù)據(jù)庫表具有相同的屬性。

接下來,使用映射器將模型類映射到數(shù)據(jù)庫表,還定義了User模型和Post模型之間的關(guān)系,其中User模型具有一個posts屬性,該屬性是用戶的帖子列表。

最后,在應(yīng)用程序中使用ORM和模型類,創(chuàng)建一些用戶和帖子,并將它們保存到數(shù)據(jù)庫中。然后,通過電子郵件地址檢索用戶并打印他們的姓名,以及檢索用戶的帖子并打印它們的標(biāo)題。

通過以這種方式反轉(zhuǎn)ORM和模型類之間的依賴關(guān)系,使代碼更加解耦且易于維護。我們可以更改數(shù)據(jù)庫模式或ORM實現(xiàn)而不必修改模型類,反之亦然,這使得輕松測試模型類,而無需設(shè)置數(shù)據(jù)庫連接。

此外,通過在ORM類中使用model屬性來返回相應(yīng)模型類的實例,進一步反轉(zhuǎn)了依賴關(guān)系,因為現(xiàn)在ORM類依賴于模型類,而不是相反。

通過使用元數(shù)據(jù)定義模式、定義模型類并使用映射器和關(guān)系來設(shè)置ORM,可以實現(xiàn)ORM和模型類之間的依賴關(guān)系反轉(zhuǎn)。通過這種方法,可以使代碼更加解耦且易于維護。

2.反轉(zhuǎn)依賴關(guān)系

在上面的代碼中,通過以下方式實現(xiàn)了ORM和模型類之間的依賴關(guān)系反轉(zhuǎn):

  1. 使用元數(shù)據(jù)定義數(shù)據(jù)庫模式:創(chuàng)建了一個metadata對象,并使用它來使用SQLAlchemy的表結(jié)構(gòu)定義數(shù)據(jù)庫模式。

  2. 定義模型類:定義了UserPost模型類,它們代表了系統(tǒng)中的實體,并定義這些實體的屬性和行為。

  3. 使用映射器和關(guān)系設(shè)置ORM:使用SQLAlchemy的mapper函數(shù)將ORM類映射到第1步中定義的數(shù)據(jù)庫模式。還使用SQLAlchemy的relationship函數(shù)定義ORM類之間的關(guān)系,例如UserPost之間的一對多關(guān)系。

通過這樣做,將ORM類與數(shù)據(jù)庫模式和模型類解耦,并使其依賴于SQLAlchemy提供的抽象,例如元數(shù)據(jù)和映射器函數(shù)。這使得修改數(shù)據(jù)庫模式或切換到不同的ORM實現(xiàn)變得更容易,而無需修改模型類。它還使模型類更容易進行測試,因為可以在不需要實例化ORM類或連接到數(shù)據(jù)庫的情況下對其進行隔離測試。文章來源地址http://www.zghlxwxcb.cn/news/detail-790528.html

到了這里,關(guān)于掌握Python設(shè)計模式,SQL Alchemy打破ORM與模型類的束縛的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 一文掌握設(shè)計模式(定義+UML類圖+應(yīng)用)

    一文掌握設(shè)計模式(定義+UML類圖+應(yīng)用)

    從學(xué)編程一開始就被告知,要想做一名優(yōu)秀的程序員兩大必要技能: 1.源碼閱讀(JDK、C等底層語言封裝) 2.設(shè)計模式(使用某種語言優(yōu)雅的落地典型場景功能)。 一般隨著工作年限的增長,被迫對底層語言/框架源碼閱讀的越來愈多,但是設(shè)計模式如不刻意去學(xué)習(xí),永遠不會真正掌

    2024年02月11日
    瀏覽(29)
  • 【chatgpt】讓gpt帶你掌握設(shè)計模式

    讓gpt帶你掌握設(shè)計模式 準(zhǔn)備設(shè)計模式面試的 概述 什么是設(shè)計模式? 為什么設(shè)計模式重要? 設(shè)計模式的分類 創(chuàng)建型模式 (Creational Patterns) 單例模式 (Singleton Pattern) 工廠模式 (Factory Pattern) 抽象工廠模式 (Abstract Factory Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 結(jié)

    2024年02月05日
    瀏覽(18)
  • AI問答:前端需要掌握的設(shè)計模式/vue項目使用了哪些設(shè)計模式/vue項目開發(fā)可以使用哪些設(shè)計模式

    AI問答:前端需要掌握的設(shè)計模式/vue項目使用了哪些設(shè)計模式/vue項目開發(fā)可以使用哪些設(shè)計模式

    一、理解什么是設(shè)計模式 設(shè)計模式是對軟件設(shè)計開發(fā)過程中反復(fù)出現(xiàn)的某類問題的通用解決方案。 設(shè)計模式是一個在軟件設(shè)計領(lǐng)域中被廣泛應(yīng)用的概念,它指的是一套被公認為有效的解決特定問題的設(shè)計思路和方法。 設(shè)計模式更多的是指導(dǎo)思想和方法論,而不是現(xiàn)成的代碼

    2024年02月09日
    瀏覽(25)
  • 探索設(shè)計模式的魅力:“感受單例模式的力量與神秘” - 掌握編程的王牌技巧

    探索設(shè)計模式的魅力:“感受單例模式的力量與神秘” - 掌握編程的王牌技巧

    ? ? ? 在軟件開發(fā)的賽場上,單例模式以其獨特的魅力長期占據(jù)著重要的地位。作為設(shè)計模式中的一員,它在整個軟件工程的棋盤上扮演著關(guān)鍵性角色。本文將帶你深入探索單例模式的神秘面紗,從歷史淵源到現(xiàn)代應(yīng)用,從基礎(chǔ)實現(xiàn)到高級技巧,經(jīng)過戲劇性的轉(zhuǎn)折和層層推進

    2024年01月20日
    瀏覽(22)
  • 掌握Go類型內(nèi)嵌:設(shè)計模式與架構(gòu)的新視角

    掌握Go類型內(nèi)嵌:設(shè)計模式與架構(gòu)的新視角

    本文深入探討了Go語言中的類型內(nèi)嵌特性,從基礎(chǔ)概念到實際應(yīng)用,以及相關(guān)的最佳實踐。文章不僅講解了如何在Go中實現(xiàn)和使用類型內(nèi)嵌,還通過具體的代碼示例展示了其應(yīng)用場景和潛在陷阱。最后,文章總結(jié)了類型內(nèi)嵌在代碼設(shè)計中的價值,并提出了一些獨特的洞見。 關(guān)

    2024年02月08日
    瀏覽(23)
  • 設(shè)計模式之-訪問者模式,快速掌握訪問者模式,通俗易懂的講解訪問者模式以及它的使用場景

    當(dāng)談到訪問者模式時,我們可以通過以下方式進行詳細解釋: 訪問者模式是一種行為型設(shè)計模式,它允許你在不修改已有代碼的情況下,向現(xiàn)有對象結(jié)構(gòu)添加新的操作。該模式將操作(或方法)封裝在稱為訪問者的獨立對象中,使得可以在不修改元素類的情況下,通過訪問者

    2024年02月03日
    瀏覽(27)
  • 《移動互聯(lián)網(wǎng)技術(shù)》 第十章 系統(tǒng)與通信: 掌握Android系統(tǒng)的分層架構(gòu)設(shè)計思想和基于組件的設(shè)計模式

    《移動互聯(lián)網(wǎng)技術(shù)》 第十章 系統(tǒng)與通信: 掌握Android系統(tǒng)的分層架構(gòu)設(shè)計思想和基于組件的設(shè)計模式

    ???? 博主 libin9iOak帶您 Go to New World.??? ?? 個人主頁——libin9iOak的博客?? ?? 《面試題大全》 文章圖文并茂??生動形象??簡單易學(xué)!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍》學(xué)會IDEA常用操作,工作效率翻倍~?? ???? 希望本文能夠給您帶來一定的幫助??文章粗淺,敬

    2024年02月16日
    瀏覽(23)
  • 【python設(shè)計模式】13、策略模式

    哲學(xué)思想: 策略模式是一種設(shè)計模式,它可以使得我們在程序中根據(jù)需要動態(tài)地選擇算法的具體實現(xiàn)方式。策略模式的思想源于哲學(xué)中的“多元論”(pluralism)和“實用主義”(pragmatism)。 多元論認為,世界上存在著許多不同的觀點和方法,沒有一個固定的標(biāo)準(zhǔn)或者方法是

    2023年04月08日
    瀏覽(36)
  • 10.python設(shè)計模式【代理模式】

    10.python設(shè)計模式【代理模式】

    內(nèi)容:為其他對象提供一種代理一控制對這個對象的訪問 應(yīng)用場景: 遠程代理: 為遠程的對象提供代理 虛代理:根據(jù)需要創(chuàng)建很大的對象 保護代理:控制對原始對象的訪問,用于對象有不同訪問權(quán)限時 UML圖 舉個例子: 需求:完成一個文件讀取和寫入,完成遠程代理、需

    2024年02月15日
    瀏覽(20)
  • 95 | Python 設(shè)計模式 —— 策略模式

    策略模式是一種行為型設(shè)計模式,它定義了一系列的算法,并將每個算法封裝在獨立的策略類中,使得這些算法可以相互替換,而不影響客戶端的使用。策略模式可以讓客戶端根據(jù)不同的需求選擇不同的算法,從而使得系統(tǒng)更加靈活和可擴展。 在本教程中,我們將學(xué)習(xí)策略模

    2024年02月13日
    瀏覽(13)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包