6

我有一个困扰我一段时间的问题。乍一看,这似乎是一个相当基本的问题,但似乎没有明确的答案。我提出这个问题的基础是一个通过 SQLAlchemy 使用 PostgreSQL 的 Python 项目,但使用的特定语言和工具并不重要。

基本问题是在使用 ORM 时将逻辑放在哪里?更具体地说,我的映射类的方法中应该包含什么逻辑?

似乎有一些明确的案例,例如,属性的基本验证,例如最小长度或某物是否是电子邮件地址应该属于 ORM 层(甚至属于数据库本身)。

一个简单的具体示例是有序的,因此假设我们正在存储用户对象,用户有一个电子邮件地址(这是他们的唯一 ID)、一个密码和一个激活 ID。创建帐户时,会分配激活 ID 并将其邮寄给用户,然后她使用该 ID 设置密码。

让我们看几个场景:

  • 用户创建一个帐户;
  • 用户激活帐户(即设置密码)。

因此,当用户创建帐户时,我们需要运行一些基本验证:

  • 电子邮件地址正确 => ORM;
  • 电子邮件地址唯一 => ORM 或数据库(唯一约束);
  • 设置一个随机激活 id => ORM

当用户激活她的帐户时,我遇到了问题。我想验证提供的密码(例如足够长?足够多的数字?),但模型应该使用某种散列或加密算法来存储密码。似乎有两种选择:

1:在模型外检查激活 id 和密码有效性,对密码进行哈希处理,然后将 User.password 设置为哈希,并将 User.activation id 设置为 null(表示活动帐户)。

2:创建一个 User.activate(activation_id, password) 方法来验证每一个并相应地设置 User.password 和 User.activation_id 属性。

3:混合选项,执行选项 1,但是在设置密码时有某种钩子或事件设置 activation_id = null,(如果我们假设可以设置激活 id 或密码,那么这个钩子满足基本一致性属性该模型)。

我在互联网上搜索过,有一些资源谈论这个问题(包括一些 SO 问题),但没有一个真正回答这个问题。

4

0 回答 0