【问题标题】:ORM: Sequelize: Add Not Equal Constraint for Two ColumnsORM:续集:为两列添加不相等的约束
【发布时间】:2020-03-31 05:13:43
【问题描述】:

我有一个following 表。我不想让用户跟随自己,所以我想添加一个CHECK 约束。

例如,如果插入,我希望数据库抛出错误。

{
   userID: 1,
   followingID: 1,
}

如果 userID 和 followingID 相等,我可以使用 Javascript 检查,但我希望数据库检查它。

我的 MYSQL 版本是 8.0.17,所以我认为可以用 SQL 创建这个约束。如何使用 Sequelize 添加此约束?

【问题讨论】:

  • 你能解释清楚一点吗?您希望某个列是唯一的,还是列的组合是唯一的?我们只是在谈论“跟随”表吗?

标签: mysql sql database orm sequelize.js


【解决方案1】:

有两种解决方案

1。使用模型验证并在数据库中手动添加检查约束:

模型验证:

const FollowingModel = sequelize.define("following", {
     userId: {
          type: Sequelize.INTEGER,
          // .. other configuration like `allowNull`
     },
     followingId: {
          type: Sequelize.INTEGER,
          // .. other configuration like `allowNull`
     }
}, {
    validate: {
         userShouldNotFollowSelf : function() {
             if(this.userId === this.followingId) {
                 throw Error("User should not follow self") // Use any custom error class if your application has such class.
             }
         }
    }
}

请注意,这将允许您在不维护此约束的数据库中创建条目。

这只是ORM的应用层检查,这个应用不会允许任何userIdfollowingId不相同的条目。

Mysql数据库层check constraint.

CREATE TABLE `following`
(
  `userId` INT NOT NULL,
  `followingId` INT NOT NULL,
  CONSTRAINT `no_self_following` CHECK (`userId` <> `followingId`)
  -- other properties and foreign key constraints.
);

它将确保不会在userIdfollowingId 相同的位置插入此类条目。

2。在sequelize查询界面声明约束。

这需要使用查询接口addConstraint 声明您的模型,如下所示

sequelize.getQueryInterface().addConstraint("following", ['userId'], {
    type: 'check',
    name: "no_self_following"
    where: {
        userId: {
            [Sequelize.Op.ne]: Sequelize.col("followingId")
        }
    }
});

在所有数据库模型都正确同步后运行。它将添加数据库级别的约束。

使用哪一个?

方法#1 更有效。它在应用程序内部进行检查,而无需进入数据库调用,使您的数据库不那么繁忙。

【讨论】:

  • 很好的答案。谢谢。
  • 更新:这个答案需要一个小的更新。查询接口addConstraint在更新版本的Sequelize中更新。您需要将字段传递给选项对象。 queryInterface.addConstraint('following', { fields: ['userId'], type: 'check', name: 'no_self_following', });
  • @Johnson 你能先接受这个问题吗?
  • 接受。谢谢。你能更新 addConstraint 参数吗?
猜你喜欢
  • 1970-01-01
  • 2013-03-25
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多