搜索
首页后端开发Python教程使用 Mixin 和注释模块化 SQLAlchemy 模型

Modularizing SQLAlchemy Models with Mixins and Annotations
构建可扩展且可维护的模型通常需要模块化方法,特别是在跨多个模型处理共享行为或公共列类型时。在本博客中,我们将介绍如何使用 SQLAlchemy 的 mixins注释.
模块化模型    

为什么要模块化?

在处理项目时,我们经常遇到重复性任务,例如向模型添加created_at和updated_at时间戳或定义常见的列类型(例如UUID主键)。将这些问题模块化为单独的组件有几个好处:
 
1. 可重用性:共享行为和列定义可以跨多个模型使用。
2. 可维护性:一个地方的更改会传播到所有依赖模型。
3. 可读性:清晰的关注点分离使代码更容易理解。

 

创建一个时间戳混合

Mixin 为模型提供可重用的逻辑或字段。让我们定义一个 TimestampMixin,它会自动将created_at 和updated_at 字段添加到继承自它的任何模型中。
 
文件:timestamp_mixin.py

from datetime import datetime
from sqlalchemy import Column, DateTime
from sqlalchemy.ext.declarative import declared_attr

class TimestampMixin:
    @declared_attr
    def created_at(cls):
        return Column(DateTime, default=datetime.utcnow, nullable=False)

    @declared_attr
    def updated_at(cls):
        return Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
解释
  • @declared_attr:确保属性动态添加到继承模型中。
  • default 和 onupdate:自动设置创建和更新的时间戳。

 

定义常用注解

SQLAlchemy 的带注释类型,可通过 Python 的打字功能使用。带注释,让您定义可重用的列属性。例如,您可以定义 UUID 主键或具有特定约束的字符串列。
 
文件: common_annotations.py

from typing import Annotated
from uuid import uuid4
from sqlalchemy import String
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import mapped_column

uuid4pk = 
    mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid4, nullable=False)
]

name = Annotated[
    str,
    mapped_column(String(30), nullable=False)
]
解释
  • UUID 主键:uuid4pk 注释定义主键的通用唯一标识符。
  • Name Column:名称注解确保 String 列的最大长度为 30 个字符,并且没有 NULL 值。

 

使用 Mixin 和注释构建模型

使用混入和注释,我们可以定义继承共享行为和属性的模型,同时保持实现简洁和可读。
 
文件: user.py

from datetime import datetime
from sqlalchemy import Column, DateTime
from sqlalchemy.ext.declarative import declared_attr

class TimestampMixin:
    @declared_attr
    def created_at(cls):
        return Column(DateTime, default=datetime.utcnow, nullable=False)

    @declared_attr
    def updated_at(cls):
        return Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
解释
  • 声明性基础:基础是所有 SQLAlchemy 模型的基础。

 

这种方法的好处

1。 明确分离关注点

  • timestamp_mixin.py:包含可重用逻辑(例如时间戳)。
  • common_annotations.py:定义公共列属性(例如,UUID、字符串)。
  • user.py:将这些构建块组合成具体模型。

2。 易于维护

  • 如果需要更改时间戳的工作方式或更新列约束,只需修改timestamp_mixin.py或common_annotations.py文件。这些更改会自动反映在所有依赖模型中。

3。 可扩展性

  • 随着项目的发展,这种结构可以更轻松地添加新行为或字段类型,而无需引入冗余。

   

最后的想法

使用 SQLAlchemy 的 mixins注释模块化模型是处理共享功能和属性的良好策略。这种方法不仅减少了重复,而且符合干净、可维护代码的最佳实践。

以上是使用 Mixin 和注释模块化 SQLAlchemy 模型的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
什么是Python Switch语句?什么是Python Switch语句?Apr 30, 2025 pm 02:08 PM

本文讨论了Python版本3.10中介绍的新“匹配”语句,该语句与其他语言相同。它增强了代码的可读性,并为传统的if-elif-el提供了性能优势

Python中有什么例外组?Python中有什么例外组?Apr 30, 2025 pm 02:07 PM

Python 3.11中的异常组允许同时处理多个异常,从而改善了并发场景和复杂操作中的错误管理。

Python中的功能注释是什么?Python中的功能注释是什么?Apr 30, 2025 pm 02:06 PM

Python中的功能注释将元数据添加到函数中,以进行类型检查,文档和IDE支持。它们增强了代码的可读性,维护,并且在API开发,数据科学和图书馆创建中至关重要。

Python的单位测试是什么?Python的单位测试是什么?Apr 30, 2025 pm 02:05 PM

本文讨论了Python中的单位测试,其好处以及如何有效编写它们。它突出显示了诸如UNITSEST和PYTEST等工具进行测试。

Python中的访问说明符是什么?Python中的访问说明符是什么?Apr 30, 2025 pm 02:03 PM

文章讨论了Python中的访问说明符,这些说明符使用命名惯例表明班级成员的可见性,而不是严格的执法。

Python中的__Init __()是什么?自我如何在其中发挥作用?Python中的__Init __()是什么?自我如何在其中发挥作用?Apr 30, 2025 pm 02:02 PM

文章讨论了Python的\ _ \ _ Init \ _ \ _()方法和Self在初始化对象属性中的作用。还涵盖了其他类方法和继承对\ _ \ _ Init \ _ \ _()的影响。

python中的@classmethod,@staticmethod和实例方法有什么区别?python中的@classmethod,@staticmethod和实例方法有什么区别?Apr 30, 2025 pm 02:01 PM

本文讨论了python中@classmethod,@staticmethod和实例方法之间的差异,详细介绍了它们的属性,用例和好处。它说明了如何根据所需功能选择正确的方法类型和DA

您如何将元素附加到Python数组?您如何将元素附加到Python数组?Apr 30, 2025 am 12:19 AM

Inpython,YouAppendElementStoAlistusingTheAppend()方法。1)useappend()forsingleelements:my_list.append(4).2)useextend()orextend()或= formultiplelements:my_list.extend.extend(emote_list)ormy_list = [4,5,6] .3)useInsert()forspefificpositions:my_list.insert(1,5).beaware

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具