web-dev-qa-db-fra.com

Sequelize.js onDelete: 'cascade' ne supprime pas les enregistrements sequelize

J'ai la table Product avec les colonnes suivantes [id, name, CategoryId] et la table Category avec [id, name]

Modèle du produit:-

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

Modèle de catégorie: -

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
}

lorsque je supprime une catégorie, il supprime uniquement la catégorie, pas les produits correspondants qui lui sont associés. Je ne sais pas pourquoi cela se passe?

mise à jour: Sequelize Version sequelize 1.7.0

=============================================== ============================= Réponse (Comment cela est-il corrigé?): -

J'ai accompli cela en ajoutant une contrainte sur la base de données à l'aide de la commande Alter, car Add Foreign Key Constraint à migration est ouvert bug in sequelize.

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

Je crois que vous êtes censé mettre onDelete dans le modèle Category au lieu de dans le modèle Products.

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
}
27
agchou

À partir de "sequelize": "^ 3.5.1", il ne fonctionne que si vous mettez onDelete='CASCADE' dans la déclaration belongsTo, qui est le modèle Product dans votre cas. Cela contredit les documents: http://sequelize.readthedocs.org/fr/latest/api/associations/index.html?highlight=onDelete#hasmanytarget-options

S'il vous plaît voir cette question: Sequelize onDelete ne fonctionne pas

11
Liwen

Je suis sur Sequelize 4.38.0.

Je devais mettre onDelete: 'CASCADE' non seulement sur la définition de l'association, mais également dans le fichier de migration.

// 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',
      },
    },
  })
},
1
Fellow Stranger

J'ai finalement pensé que cela ne fonctionnait pas pour moi à cause de la paranoïa. Sequelize ne gère pas cascade et effectue une suppression cascade de MySQL. Cela dit, si vous utilisez paranoïaque avec vos tables, la cascade ne se produira pas car les enregistrements ne sont pas vraiment supprimés de la table. 

0
ecdeveloper