我有这个问题一直困扰着我一段时间。乍一看,它似乎是一个相当基本的问题,但似乎没有一个明确的答案。我提出这个问题的基础是一个通过SQLAlchemy使用PostgreSQL的Python项目,但使用的特定语言和工具并不重要。
基本问题是在使用ORM时放置逻辑的位置?更具体地说,我的映射类的方法应该采用什么逻辑?
似乎有一些明确的案例,例如,属性的基本验证,例如最小长度或某些电子邮件地址是否属于ORM层(甚至属于数据库本身。)< / p>
一个简单的具体示例是有序的,因此我们假设我们正在存储用户对象,用户有一个电子邮件地址(这是他们唯一的ID),密码和激活ID。创建帐户时,会分配激活ID并将其邮寄给用户,然后用户设置密码。
让我们看几个场景:
因此,当用户创建帐户时,我们需要运行一些基本验证:
当用户激活她的帐户时,我遇到了问题。我想验证提供的密码(例如足够长?足够的数字?),但模型应使用某种散列或加密算法存储密码。似乎有两种选择:
1:检查模型外的激活ID和密码有效性,散列密码,然后将User.password设置为散列,将User.activation id设置为null(表示活动帐户)。
2:创建一个User.activate(activation_id,password)方法,该方法验证每个并相应地设置User.password和User.activation_id属性。
3:混合选项,执行选项1,但在设置密码时设置某种钩子或事件激活_id = null(如果我们假设可以设置激活ID或密码,则此钩子满足基本模型的一致性属性。)
我在互联网上搜索过,有些消息来源谈论这个问题(包括一些SO问题),但没有人真正回答这个问题。