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

使用 Mixin 和注释模块化 SQLAlchemy 模型

DDD
发布: 2025-01-04 20:08:43
原创
609 人浏览过

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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板