ORM: Sequelize: добавить неравное ограничение для двух столбцов - PullRequest
0 голосов
/ 31 марта 2020

У меня есть following таблица. Я не хочу, чтобы пользователь следовал за собой, поэтому я хочу добавить ограничение CHECK.

enter image description here

Например, если оно вставлено, я хочу, чтобы база данных выдавала ошибку.

{
   userID: 1,
   followingID: 1,
}

Я могу проверить с помощью Javascript, равны ли userID и followID, но я хочу, чтобы база данных проверила это.

Моя MYSQL версия 8.0 .17, поэтому я думаю, что можно создать это ограничение с SQL. Как я могу добавить это ограничение с Sequelize?

1 Ответ

1 голос
/ 31 марта 2020

Есть два решения

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, что это приложение не разрешит ввод, где userId и followingId не совпадают.

Mysql уровень базы данных проверка ограничения .

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

Это обеспечит отсутствие вставки такой записи, если userId и followingId совпадают.

2. Объявление ограничения в интерфейсе запросов sequelize.

Для этого необходимо объявить модель с использованием интерфейсов запросов addConstraint следующим образом

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

Запустите это, пока все модели базы данных синхронизированы правильно , Это добавит ограничение уровня базы данных.

Какой из них использовать?

Подход № 1 более эффективен. Это проверка внутри приложения без входа в базу данных, делает вашу базу данных менее занятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...