构建可扩展且可维护的模型通常需要模块化方法,特别是在跨多个模型处理共享行为或公共列类型时。在本博客中,我们将介绍如何使用 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)
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) ]
使用混入和注释,我们可以定义继承共享行为和属性的模型,同时保持实现简洁和可读。
文件: 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)
1。 明确分离关注点
2。 易于维护
3。 可扩展性
使用 SQLAlchemy 的 mixins 和 注释模块化模型是处理共享功能和属性的良好策略。这种方法不仅减少了重复,而且符合干净、可维护代码的最佳实践。
以上是使用 Mixin 和注释模块化 SQLAlchemy 模型的详细内容。更多信息请关注PHP中文网其他相关文章!