Sequelize.js onDelete:'cascade'不会删除sequelize记录

时间:2014-04-17 09:00:03

标签: node.js sequelize.js

我的Product表包含以下列[id, name, CategoryId]Category表格[id, name]

产品型号: -

module.exports = function(sequelize, DataTypes) {
  var Product = sequelize.define('Product', {
    name: DataTypes.STRING
  }, {
    associate: function(models) {
      Product.belongsTo(models.Category);
    }
  });
  return Product
}

类别模型: -

module.exports = function(sequelize, DataTypes) {
  var Category = sequelize.define('Category', {
    name: { type: DataTypes.STRING, allowNull: false }
  }, {
    associate: function(models) {
      Category.hasMany(models.Product, { onDelete: 'cascade' });
    }
  });
  return Category
}

当我删除类别时,它仅删除类别而不删除与其关联的相应产品。我不知道为什么会这样吗?

更新: 续集版本sequelize 1.7.0

=============================================== ================================= 答案(我如何修复。): -

我通过使用Alter命令在数据库中添加约束来完成此操作,因为Add Foreign Key Constraintmigrationsequelize中是一个开放的bug

ALTER TABLE "Products"
ADD CONSTRAINT "Products_CategoryId_fkey" FOREIGN KEY ("CategoryId")
REFERENCES "Categories" (id) MATCH SIMPLE
ON DELETE CASCADE

9 个答案:

答案 0 :(得分:27)

我相信你应该把onDelete放在Category模型而不是产品模型中。

module.exports = function(sequelize, DataTypes) {
  var Category = sequelize.define('Category', {
    name: { type: DataTypes.STRING, allowNull: false }
  }, {
    associate: function(models) {
      Category.hasMany(models.Product, { onDelete: 'cascade' });
    }
  });
  return Category
}

答案 1 :(得分:12)

从#34; sequelize":" ^ 3.5.1",它只适用于onDelete='CASCADE'声明中的belongsTo {在你的情况下{1}}模型。这与文档相矛盾:http://sequelize.readthedocs.org/en/latest/api/associations/index.html?highlight=onDelete#hasmanytarget-options

请参阅此问题:Sequelize onDelete not working

答案 2 :(得分:2)

我正在使用Sequelize 4.38.0。

我不仅要在关联定义中添加onDelete: 'CASCADE',还要在迁移文件中添加

// in models/user.js
User.associate = models => {
  User.belongsTo(models.Organization, {
    foreignKey: { name: 'organizationId', allowNull: true },
    onDelete: 'CASCADE',
  })
}

// in migrations/create-users.js
up: (queryInterface, Sequelize) => {
  return queryInterface.createTable('Users', {
    // other fields...
    organizationId: {
      type: Sequelize.INTEGER,
      allowNull: true,
      onDelete: 'CASCADE',
      references: {
        model: 'Organizations',
        key: 'id',
        as: 'organizationId',
      },
    },
  })
},

答案 3 :(得分:1)

hasMany关联上,添加onDelete级联并像这样将钩子设置为true

 Category.hasMany(models.Product, { onDelete: 'cascade', hooks:true });

答案 4 :(得分:0)

我终于发现,由于偏执,它对我不起作用。 Sequelize不处理cascade,而是MySQL级联删除。话虽如此,如果您对表使用偏执狂-级联将不会发生,因为记录并未真正从表中删除。

答案 5 :(得分:0)

这里的问题是生成了一些时间迁移脚本,其中缺少CONSTRAINT的{​​{1}}。

我仍在关注foreign key的问题{@ 3}}。

这是我的解决方法:

步骤1:照常创建迁移文件,但尚未创建{ onDelete: 'cascade', hooks: true }。请记住像您一样定义foreign key

associate

第2步:创建迁移脚本,将 Product.belongsTo(models.Category); Category.hasMany(models.Product); 列添加到表中:

foreign key

希望获得帮助!

我通过结合以下方法找到了该解决方案:

答案 6 :(得分:0)

OP的答案已添加到问题中:

我通过使用Alter在数据库上添加约束来实现这一点 命令,因为Add Foreign Key Constraintmigration是一个 在sequelize中打开[bug] [1]。

ALTER TABLE "Products"
ADD CONSTRAINT "Products_CategoryId_fkey" FOREIGN KEY ("CategoryId")
REFERENCES "Categories" (id) MATCH SIMPLE
ON DELETE CASCADE

答案 7 :(得分:0)

我不知道为什么,但这 {onDelete: 'cascade', hooks: true} 对我不起作用。 如果您遇到同样的问题,请尝试在模型的迁移文件中添加 reference 相关代码。

"use strict";
module.exports = {
    up: async (queryInterface, Sequelize) => {
        await queryInterface.createTable("TravelDetails", {
            id: {
                ......
            },
            event_id: {
                type: Sequelize.INTEGER,
                onDelete: "CASCADE",
                references: {
                    model: "Events",
                    key: "id",
                    as: "eventData",
                },
            },
        });
    },
    down: async (queryInterface, Sequelize) => {
        await queryInterface.dropTable("TravelDetails");
    },
};

答案 8 :(得分:0)

我无法管理最新的“续集”:“^6.6.5”关联级联以使用此处提到的任何提示处理现有的 postgres 数据库,因此必须将其替换为模型 beforeDestroy 钩子,如下所示< /p>

User.beforeDestroy(async user => {
  await Role.destroy({ where: { userId: user.id } })
})