【问题标题】:Sequelize Unique constraint + paranoidSequelize Unique 约束 + 偏执狂
【发布时间】:2021-04-04 13:41:05
【问题描述】:

我有一张表,它对字段 + 偏执具有唯一约束。 在下面的示例中,品牌名称是唯一值

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 必须为此提供内置解决方案... 有什么想法???

【问题讨论】:

  • 当您尝试 brand name + deleted_at 唯一约束时究竟是什么失败了?
  • 我重新考虑了它并手动更改\重新定义 deleteAt 字段是一个坏主意,因为 Sequelize 在获取对象时依赖该字段为空。所以我尝试定义一个像这样的复合联合约束:``` uniqueKeys: { name_unique: { fields: ['brand_name', 'deletedAt'] } } `` 但显然,具有空字段的唯一约束不起作用,因为可以插入同名的重复记录和空的deletedAt。
  • 它有效吗?
  • 不,正如我提到的,可以插入多个具有相同品牌名称的行。
  • 您是否在 DB 中创建了这个唯一索引?

标签: node.js sequelize.js unique-constraint


【解决方案1】:

我认为最干净的解决方案,即创建续集的偏执功能来处理,是恢复原始记录。恢复后,您可以更新该记录以满足您的需要。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2016-10-27
    • 1970-01-01
    • 2021-12-09
    • 2017-08-05
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多