删除父级时 Sequelize orphan removal

Sequelize orphan removal when deleting parent

我在 mysql 中有两个表:

create table comments
(
    id                 int unsigned auto_increment primary key,
    postId             varchar(100)                not null,
    text               text                        not null,
    constraint commentForPost foreign key (postId) references posts (id)
);

create table post
(
    id               varchar(100)                        not null primary key,
    name             varchar(100)                        not null,
);

和后续的两个模型: post.js 文件:

class Post extends Model {}

Post.init({
    // Model attributes are defined here
    id: {
        type: DataTypes.STRING,
        primaryKey: true
    },
    name: {
        type: DataTypes.STRING,
    }
}, {
    // Other model options go here
    sequelize, // We need to pass the connection instance
    modelName: 'Post', // We need to choose the model name
    tableName: 'posts',
    timestamps: false
});


Post.hasMany(Comment, { foreignKey: 'postId', onDelete: 'CASCADE'})
Comment.belongsTo(Post, { foreignKey: 'postId' });

comment.js 文件:

class Comment extends Model {}
Comment.init({
    // Model attributes are defined here
    id: {
        type: DataTypes.STRING,
        primaryKey: true
    },
    postId: {
        type: DataTypes.STRING,
        allowNull: false
    },
    text: {
        type: DataTypes.text,
        allowNull: false
    }
}, {
    // Other model options go here
    sequelize, // We need to pass the connection instance
    modelName: 'Comment', // We need to choose the model name
    tableName: 'comments',
    timestamps: false
});

现在我想在删除post的同时删除post的评论。我使用的代码如下:

  const post = await Post.destroy({
    where: {id}
  });

这会生成以下查询:

DELETE FROM `posts` WHERE `id` = '1'

我得到的错误如下:

UnhandledPromiseRejectionWarning: SequelizeForeignKeyConstraintError: Cannot delete or update a parent row: a foreign key constraint fails (db.comments, CONSTRAINT commentForPost FOREIGN KEY (postId) REFERENCES posts (id))

我的sequelize版本是:6.3.5

我怎样才能删除 post 并同时删除“孤立”评论?

您指定了 onDelete: 'CASCADE',此选项将有效,但仅适用于 sequelize.sync 调用(使用此选项创建外键)。通常的 destroy 调用不会考虑此选项。所以你应该手动更改现有的外键来设置 ON DELETE CASCADE.