掌握Python设计模式,SQL Alchemy打破ORM与模型类的束缚

这篇具有很好参考价值的文章主要介绍了掌握Python设计模式,SQL Alchemy打破ORM与模型类的束缚。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好,反转软件组件之间的依赖关系之所以重要,是因为它有助于降低耦合度和提高模块化程度,进而可以提高软件的可维护性、可扩展性和可测试性。

当组件之间紧密耦合时,对一个组件的更改可能会对其他组件产生意想不到的影响,从而导致整个系统中的连锁更改效应。通过反转依赖关系,可以确保组件仅依赖于抽象而不是具体实现来减轻这个问题。

就ORM和模型类而言,反转依赖关系允许ORM和模型类相互独立地发展,有助于使代码更加模块化、更具可维护性。例如,如果数据库模式发生更改,可以更新ORM以反映新的模式,而无需修改模型类。同样,如果想切换到不同的ORM,我们也可以这样做,而无需修改模型类。

此外,反转依赖关系还允许对每个组件进行单独测试,从而使代码更具可测试性。例如,可以为模型类编写单元测试,而无需设置数据库连接,因为模型类并不依赖于ORM。同样可以为ORM编写集成测试,而无需实例化模型类,因为ORM仅依赖于模型类的抽象。

1.代码示例

以下是一个使用Python中的SQLAlchemy反转ORM和模型类之间依赖关系的示例。首先使用元数据定义模式,然后定义模型类,最后使用映射器和关系设置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

# 使用元数据定义模式
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

# 使用映射器和关系设置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)

# 在应用程序中使用ORM和模型类
session = Session()


# 创建一些用户和帖子
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)

# 将用户和帖子保存到数据库
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"

在这段代码中,首先使用元数据定义了模式,并为数据库中的每个表定义了单独的类。然后定义模型类UserPost,它们与相应的数据库表具有相同的属性。

接下来,使用映射器将模型类映射到数据库表,还定义了User模型和Post模型之间的关系,其中User模型具有一个posts属性,该属性是用户的帖子列表。

最后,在应用程序中使用ORM和模型类,创建一些用户和帖子,并将它们保存到数据库中。然后,通过电子邮件地址检索用户并打印他们的姓名,以及检索用户的帖子并打印它们的标题。

通过以这种方式反转ORM和模型类之间的依赖关系,使代码更加解耦且易于维护。我们可以更改数据库模式或ORM实现而不必修改模型类,反之亦然,这使得轻松测试模型类,而无需设置数据库连接。

此外,通过在ORM类中使用model属性来返回相应模型类的实例,进一步反转了依赖关系,因为现在ORM类依赖于模型类,而不是相反。

通过使用元数据定义模式、定义模型类并使用映射器和关系来设置ORM,可以实现ORM和模型类之间的依赖关系反转。通过这种方法,可以使代码更加解耦且易于维护。

2.反转依赖关系

在上面的代码中,通过以下方式实现了ORM和模型类之间的依赖关系反转:

  1. 使用元数据定义数据库模式:创建了一个metadata对象,并使用它来使用SQLAlchemy的表结构定义数据库模式。

  2. 定义模型类:定义了UserPost模型类,它们代表了系统中的实体,并定义这些实体的属性和行为。

  3. 使用映射器和关系设置ORM:使用SQLAlchemy的mapper函数将ORM类映射到第1步中定义的数据库模式。还使用SQLAlchemy的relationship函数定义ORM类之间的关系,例如UserPost之间的一对多关系。

通过这样做,将ORM类与数据库模式和模型类解耦,并使其依赖于SQLAlchemy提供的抽象,例如元数据和映射器函数。这使得修改数据库模式或切换到不同的ORM实现变得更容易,而无需修改模型类。它还使模型类更容易进行测试,因为可以在不需要实例化ORM类或连接到数据库的情况下对其进行隔离测试。文章来源地址https://www.toymoban.com/news/detail-790528.html

到了这里,关于掌握Python设计模式,SQL Alchemy打破ORM与模型类的束缚的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文掌握设计模式(定义+UML类图+应用)

    从学编程一开始就被告知,要想做一名优秀的程序员两大必要技能: 1.源码阅读(JDK、C等底层语言封装) 2.设计模式(使用某种语言优雅的落地典型场景功能)。 一般随着工作年限的增长,被迫对底层语言/框架源码阅读的越来愈多,但是设计模式如不刻意去学习,永远不会真正掌

    2024年02月11日
    浏览(50)
  • 【chatgpt】让gpt带你掌握设计模式

    让gpt带你掌握设计模式 准备设计模式面试的 概述 什么是设计模式? 为什么设计模式重要? 设计模式的分类 创建型模式 (Creational Patterns) 单例模式 (Singleton Pattern) 工厂模式 (Factory Pattern) 抽象工厂模式 (Abstract Factory Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 结

    2024年02月05日
    浏览(29)
  • AI问答:前端需要掌握的设计模式/vue项目使用了哪些设计模式/vue项目开发可以使用哪些设计模式

    一、理解什么是设计模式 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。 设计模式是一个在软件设计领域中被广泛应用的概念,它指的是一套被公认为有效的解决特定问题的设计思路和方法。 设计模式更多的是指导思想和方法论,而不是现成的代码

    2024年02月09日
    浏览(48)
  • 探索设计模式的魅力:“感受单例模式的力量与神秘” - 掌握编程的王牌技巧

          在软件开发的赛场上,单例模式以其独特的魅力长期占据着重要的地位。作为设计模式中的一员,它在整个软件工程的棋盘上扮演着关键性角色。本文将带你深入探索单例模式的神秘面纱,从历史渊源到现代应用,从基础实现到高级技巧,经过戏剧性的转折和层层推进

    2024年01月20日
    浏览(38)
  • 掌握Go类型内嵌:设计模式与架构的新视角

    本文深入探讨了Go语言中的类型内嵌特性,从基础概念到实际应用,以及相关的最佳实践。文章不仅讲解了如何在Go中实现和使用类型内嵌,还通过具体的代码示例展示了其应用场景和潜在陷阱。最后,文章总结了类型内嵌在代码设计中的价值,并提出了一些独特的洞见。 关

    2024年02月08日
    浏览(34)
  • 设计模式之-访问者模式,快速掌握访问者模式,通俗易懂的讲解访问者模式以及它的使用场景

    当谈到访问者模式时,我们可以通过以下方式进行详细解释: 访问者模式是一种行为型设计模式,它允许你在不修改已有代码的情况下,向现有对象结构添加新的操作。该模式将操作(或方法)封装在称为访问者的独立对象中,使得可以在不修改元素类的情况下,通过访问者

    2024年02月03日
    浏览(44)
  • 《移动互联网技术》 第十章 系统与通信: 掌握Android系统的分层架构设计思想和基于组件的设计模式

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月16日
    浏览(46)
  • 10.python设计模式【代理模式】

    内容:为其他对象提供一种代理一控制对这个对象的访问 应用场景: 远程代理: 为远程的对象提供代理 虚代理:根据需要创建很大的对象 保护代理:控制对原始对象的访问,用于对象有不同访问权限时 UML图 举个例子: 需求:完成一个文件读取和写入,完成远程代理、需

    2024年02月15日
    浏览(32)
  • 95 | Python 设计模式 —— 策略模式

    策略模式是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装在独立的策略类中,使得这些算法可以相互替换,而不影响客户端的使用。策略模式可以让客户端根据不同的需求选择不同的算法,从而使得系统更加灵活和可扩展。 在本教程中,我们将学习策略模

    2024年02月13日
    浏览(23)
  • 【python设计模式】13、策略模式

    哲学思想: 策略模式是一种设计模式,它可以使得我们在程序中根据需要动态地选择算法的具体实现方式。策略模式的思想源于哲学中的“多元论”(pluralism)和“实用主义”(pragmatism)。 多元论认为,世界上存在着许多不同的观点和方法,没有一个固定的标准或者方法是

    2023年04月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包