我正在为 SQLAlchemy 开发一个 Audit mixin,但不确定如何执行此操作。
我的课看起来像这样:
class AuditColumns(object):
created_dt = Column(DateTime,
default=datetime.utcnow(),
nullable=False)
created_by = Column(String(64),
default=current_user,
nullable=False)
updated_dt = Column(DateTime,
default=datetime.utcnow(),
nullable=False,
onupdate=datetime.utcnow())
updated_by = Column(String(64),
default=current_user,
nullable=False,
onupdate=current_user)
更新的很好,因为我只需要在表级别记录最新的更新;任何重要的审计都将保存在一个单独的表格中,详细说明更新/删除等。
我的问题是;我不希望更新 created_dt/by 列。我知道,在我的代码中,我可以在更新对象时简单地省略它们;但另一个编码器可能;所以我真的想确保在每次更新之前它会用自身覆盖值,或者如果有人试图更改它会引发错误(后者是首选)。
我的 SQLAlchemy 技能仍在开发中,是否可以解决事件?或者是否可以通过覆盖一些通用的声明性函数(如 save() 或 before_save() 或任何可能存在的函数来完成?
我会继续寻找答案 - 但最好是帮助找到解决方案(我不希望得到代码)。