#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 } })
Ответ №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
на разрыв уникальности удаленных (или скрытых) записей