You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Alembic自动添加并维护created_at与updated_at列?

在Alembic中实现Rails风格的created_at/updated_at自动管理

要实现和Rails一致的自动时间戳字段(创建时自动设置created_at,更新时自动刷新updated_at),需要结合SQLAlchemy的Mixin和Alembic的自动迁移配置,以下是完整解决方案:

1. 编写可复用的时间戳Mixin

使用SQLAlchemy的declared_attr装饰器确保Mixin字段被正确注入到每个继承的模型中,这是让Alembic自动识别字段的关键:

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

class TimestampMixin:
    @declared_attr
    def created_at(cls):
        # 创建时自动设置为当前时间,不可为空
        return Column(DateTime, default=func.now(), nullable=False)
    
    @declared_attr
    def updated_at(cls):
        # 创建时设置初始值,每次更新时自动刷新
        return Column(DateTime, default=func.now(), onupdate=func.now(), nullable=False)

2. 模型继承Mixin

所有需要时间戳的模型直接继承这个Mixin即可,无需重复定义字段:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from .mixins import TimestampMixin

Base = declarative_base()

class User(Base, TimestampMixin):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    username = Column(String(50), unique=True, nullable=False)

3. 配置Alembic自动识别Mixin字段

修改Alembic生成的env.py文件,确保target_metadata指向你的Base模型的元数据,这样Alembic的自动迁移功能能扫描到Mixin注入的字段:

# 在env.py中找到以下部分,替换为你的Base导入
from myapp.models import Base  # 替换为你的Base类所在路径
target_metadata = Base.metadata

4. 生成并应用迁移

运行Alembic的自动迁移命令,框架会自动检测到模型中的created_at和updated_at字段,无需手动编写迁移代码:

# 生成迁移脚本
alembic revision --autogenerate -m "add users table with timestamps"
# 应用迁移到数据库
alembic upgrade head

关键注意事项

  • 必须使用@declared_attr:直接在Mixin中定义字段(不使用装饰器)会导致SQLAlchemy无法将字段注册到模型的表结构中,Alembic也就无法自动识别。
  • 自动更新逻辑:onupdate=func.now()会让SQLAlchemy在模型实例被更新时自动将updated_at设为当前时间,无需手动调用代码。
  • 数据库兼容性:func.now()会自动适配MySQL、PostgreSQL等不同数据库的时间函数,无需手动替换。

内容的提问来源于stack exchange,提问作者Manu shalta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:50:07