在 sqlalchemy 中提交之前运行清理/验证代码

J-b*_*bob 2 postgresql sqlalchemy

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

class User(db.Model):
   ...
   email = db.Column(db.String())
   zipCode = db.Column(db.String())
   lat = db.Column(db.Float())
   lng = db.Column(db.Float())
   ...
Run Code Online (Sandbox Code Playgroud)

在提交这份文件之前,我想:

  • 修剪电子邮件字段的任何前导和尾随空格
  • 确保邮政编码是一个 5 位数字字符串(我将为此定义一个正则表达式)
  • 自动查找邮政编码的相应纬度/经度并将其保存在lat&lng字段中。
  • 数据库架构不能强制执行的其他事情

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

Phi*_*oso 5

我发现最简单的方法是挂钩更新和插入事件。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)
Run Code Online (Sandbox Code Playgroud)

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