【问题标题】:Running cleaning/validation code before committing in sqlalchemy在 sqlalchemy 中提交之前运行清理/验证代码
【发布时间】:2025-11-26 04:05:01
【问题描述】:

我对 PostGreSQL 和 SQLAlchemy 完全陌生,我正在尝试弄清楚如何在 SQLAlchemy 模型上运行验证/清理代码,然后再将其提交到数据库。这个想法是为了确保数据的一致性超出 SQL 数据库中内置的标准类型强制执行。例如,如果我有一个基于 SQLAlchemy 模型构建的 User 模型,

class User(db.Model):
   ...
   email = db.Column(db.String())
   zipCode = db.Column(db.String())
   lat = db.Column(db.Float())
   lng = db.Column(db.Float())
   ...

在提交此文档之前,我想:

  • 从电子邮件字段中删除所有前导和尾随空格
  • 确保邮政编码是 5 位数字字符串(我将为此定义一个正则表达式)
  • 自动查找邮政编码对应的纬度/经度,并将其保存在latlng字段中。
  • 数据库架构无法强制执行的其他事情

SQLAlchemy 是否提供了一种简单的方法来提供保证在提交执行此类任意任务之前运行的 Python 代码?

【问题讨论】:

    标签: postgresql sqlalchemy


    【解决方案1】:

    我发现最简单的方法是挂钩更新和插入事件。 http://docs.sqlalchemy.org/en/latest/orm/events.html

    from sqlalchemy import event
    
    def my_before_insert_listener(mapper, connection, target):
        target.email=target.email.trim()
        #All the other stuff
    
    # associate the listener function with User,
    # to execute during the "before_insert" hook
    event.listen(
        User, 'before_insert', my_before_insert_listener)
    

    您可以创建执行此类操作的自定义 sqlalchemy 类型。

    【讨论】:

    • 你能详细说明我如何“创建自定义 sqlalchemy 类型”来做那种事情吗?
    • 不确定您想要做什么的具体细节我将不得不向您推荐文档。 docs.sqlalchemy.org/en/latest/core/custom_types.html 。最常见的模式是覆盖现有 sqlalchemy 类型的 process_bind_param 和 process_result_value。
    最近更新 更多