即使 paranoid 设置为 true,Sequelize.js 仍会删除表行

Posted

技术标签:

【中文标题】即使 paranoid 设置为 true,Sequelize.js 仍会删除表行【英文标题】:Sequelize.js still deletes table row even if paranoid is set to true 【发布时间】:2017-09-15 02:47:05 【问题描述】:

我无法让 Sequelize.js 软删除表中的行。我使用 Sequelize cli 进行所有迁移,并且我没有使用同步功能在启动时重新同步数据库。我的迁移和模型中有时间戳字段,甚至是 deletedAt 字段(模型也有偏执:true),无论如何它仍然删除行而不是向 deletedAt 字段添加时间戳。我注意到当进行任何查询时,它不会像我在一些教程中看到的那样在查询中添加 deletedAt = NULL。我正在使用 Sequelize.js v3.29.0。

模型文件:

'use strict';
module.exports = function(sequelize, DataTypes) 
  var Collection = sequelize.define('Collection', 
    userId: 
      type: DataTypes.INTEGER,
      allowNull: false,
      validate: 
          isInt: true
      
    ,
    name: 
      type: DataTypes.STRING,
      allowNull: false
    ,
    description: DataTypes.TEXT,
    createdAt: 
        allowNull: false,
        type: DataTypes.DATE
    ,
    updatedAt: 
        allowNull: false,
        type: DataTypes.DATE
    ,
    deletedAt: 
        type: DataTypes.DATE
    
  , 
    classMethods: 
      associate: function(models) 
        Collection.belongsTo(models.User,  foreignKey: 'userId' )
      
    
  , 
    timestamps: true,
    paranoid: true
  );
  return Collection;
;

迁移文件:

'use strict';
module.exports = 
  up: function(queryInterface, Sequelize) 
    return queryInterface.createTable('Collections', 
      id: 
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      ,
      userId: 
        allowNull: false,
        type: Sequelize.INTEGER
      ,
      name: 
        allowNull: false,
        type: Sequelize.STRING
      ,
      description: 
        type: Sequelize.TEXT
      ,
      createdAt: 
        allowNull: false,
        type: Sequelize.DATE
      ,
      updatedAt: 
        allowNull: false,
        type: Sequelize.DATE
      ,
      deletedAt: 
          type: Sequelize.DATE
      
    );
  ,
  down: function(queryInterface, Sequelize) 
    return queryInterface.dropTable('Collections');
  
;

这是我用来销毁集合对象的控制器中的代码。

Collection.findOne(
        where: 
            id: collectionId,
            userId: user.id
        
    ).then(function(collection)
        if (collection !== null) 
            collection.destroy().then(function()
                res.redirect('/collection');
            ).catch(function(error)
                res.redirect('/collection/'+collectionId);
            );
        
    );

【问题讨论】:

【参考方案1】:

确保 paranoid 是在第二个对象参数中定义的属性。

..., 
classMethods: 
    associate: function(models) 
        Collection.belongsTo(models.User, foreignKey: 'userId' )
      
  ,
    timestamps: true,
    paranoid: true

您已将 paranoid 定义为 3. Param,这就是问题所在。

【讨论】:

非常感谢。我没有意识到类级别选项与模型定义的第二级中的 classMethods 和 instanceMethods 进入相同的位置。

以上是关于即使 paranoid 设置为 true,Sequelize.js 仍会删除表行的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使我已将 withCredentials 设置为 true,Angular 也不通过 POST 请求发送 cookie?

即使规则设置为 true,也可以用 firebase 反应 CORS 问题

即使存在未设置为true,Rails验证也需要数值

当达到测试超时时,Maven 肯定会失败构建,即使失败时设置为 true

带有 setWordWrap(True) 的 QLabel 在放置在 QListWidget 中时不会垂直调整大小,即使 resizeMode 已设置为 Adjust

即使在 project.json 中将 allowunsafe 标志设置为 true 后,.NET Core 中的不安全代码编译错误