Сиквелировать уникальное ограничение paranoid

#node.js #sequelize.js #unique-constraint

#node.js #sequelize.js #уникальное ограничение

Вопрос:

У меня есть таблица, которая имеет уникальное ограничение на поле paranoid. В приведенном ниже примере название бренда является уникальным значением

 class Brand extends Model {
        static init(sequelize) {
            return super.init(
                {
                    BrandID: {
                        field: "brand_id",
                        type: DataTypes.INTEGER(11),
                        allowNull: false,
                        primaryKey: true,
                        autoIncrement: true
                    },
                    BrandName: {
                        field: "brand_name",
                        type: DataTypes.STRING(40),
                        allowNull: false,
                        unique: true
                    }
                },
                {
                    sequelize,
                    tableName: "brands",
                    timestamps: true,
                    paranoid: true
                }
            );
        }

        static associate(models) {

        }

    };
 

Проблема в том, что после удаления объекта я не могу добавить другой объект с тем же названием бренда из-за уникального ограничения, хотя он помечен как удаленный, как и ожидалось.

Я думал определить поле как часть модели, то есть добавить, что:

                     DeletedAt: {
                        field: "deleted_at",
                        type: DataTypes.DATE,
                        allowNull: false,
                        defaultValue: 0
                    }
 

и наличие составного уникального ограничения для названия бренда deleted_at, но оно терпит неудачу.

Для этого у Sequelize должно быть встроенное решение… Есть идеи???

Комментарии:

1. Что именно не удается, когда вы пробовали brand name deleted_at уникальное ограничение?

2. Я переосмыслил это, и изменение переопределение поля deleteAt вручную — плохая идея, потому что Sequelize полагается на то, что поле равно нулю при извлечении объектов. Итак, я попытался определить составное ограничение объединения следующим образом: «uniqueKeys: { name_unique: { fields: [‘brand_name’, ‘deletedAt’] } } `, но, по-видимому, уникальное ограничение с нулевым полем не работает, так как могут быть вставлены повторяющиеся записи с тем же именем и пустые удаленные поля.

3. И это работает?

4. Нет, как я уже упоминал, можно вставить несколько строк с одним и тем же названием бренда.

5. И вы создали этот уникальный индекс в БД?

Ответ №1:

Я думаю, что самое чистое решение, для обработки которого была создана функция paranoid в sequelize, — это восстановить исходную запись. После восстановления вы можете обновить эту запись в соответствии с вашими потребностями.

 // Example showing the static `restore` method.
await Brand.restore({ where: { BrandName: someBrandYouNeedAgain } })
 

https://sequelize.org/master/manual/paranoid.html#restoring

Ответ №2:

Вы можете использовать отдельный столбец для решения этой проблемы, например:

  • колонка "ConstraintsSalt" boolean default true
  • уникальный индекс (https://sequelize.org/docs/v6/other-topics/indexes /) или ограничение на несколько столбцов — «Фирменное наименование» «ConstraintsSalt»
  • расширьте параноидальную модель с помощью крючка «beforeDestroy» (https://sequelize.org/docs/v6/other-topics/hooks /) и настроен ConstraintsSalt = null на разрыв уникальности удаленных (или скрытых) записей