【问题标题】:Cascade deletion on paranoid tables - Sequelize偏执表上的级联删除 - Sequelize
【发布时间】:2015-01-14 23:53:15
【问题描述】:

我有两个偏执表(用户和电子邮件)之间的关系,并且我在关系上有 onDelete: 'cascade' 选项( Email.belongsTo(User, onDelete:'cascade') )。

问题是当我删除用户时,他的电子邮件没有被级联删除。

是我做错了还是sequelize有bug?

我在 postgres 数据库上使用 sequelize 2.0.0-rc2。

谢谢。

PS.:请看一下我用于测试的代码:

var Sequelize = require('sequelize')
    , sequelize = new Sequelize('test', 'test', 'test', {dialect: 'postgres'});

var User = sequelize.define('User', {
    username: Sequelize.STRING,
    birthday: Sequelize.DATE
}, {paranoid: true}); //Without paranoid the code works fine

var Email = sequelize.define('Email', {
    email: Sequelize.STRING,
    primary: Sequelize.BOOLEAN
}, {paranoid: true}); //Without paranoid the code works fine

Email.belongsTo(User, {onDelete: 'cascade'});

sequelize.sync().success(function () {
    var userCreatedInstance = null;

    var deletedUserId = null;
    var cascadeDeletedEmailId = null;

    User
        .create({
            username: 'user1',
            birthday: new Date(1986, 06, 28)
        })
        .then(function (_user) {
            userCreatedInstance = _user;
            deletedUserId = userCreatedInstance.id;
            return Email.create({email: 'email1@test.com', primary: true, UserId: userCreatedInstance.id});
        })
        .then(function (createdEmail) {
            cascadeDeletedEmailId = createdEmail.id;
            return userCreatedInstance.destroy();
        })
        .then(function () {
            return User.find(deletedUserId);
        })
        .then(function (foundUser) {
            if(foundUser){
                throw new Error("Shouldn't find the user with this id");
            }
            return Email.find(cascadeDeletedEmailId);
        })
        .then(function (foundEmail){
            if(foundEmail){
                console.log(foundEmail.values);
                throw new Error("Shouldn't find the email with this id");
            }
        });
});

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    如果你想让级联在偏执狂上工作,你将不得不使用钩子。 请在下面找到我的工作方式

    我在父表(关系的基础)上添加了一个 afterDestroy 钩子, 我让它得到了与之关联的模型,并在其上调用了destroy方法。 就这么简单! 我相信我们可以让它以这种方式工作,直到维护者给我们另一种方法

    // User Model
    const User = sequelize.define('users', {....},
    {
            tableName: 'users',
            deletedAt: 'deletedAt',
            paranoid: true,
            timestamps: true,
            hooks: {
                afterDestroy: function (instance, options) {
                    instance.getProduct().then(product=> product.destroy()); // Softdelete on product table
                    console.log('after destroy: destroyed');
                }
            }
        }
    );
    
    // Product Model
    const Product = sequelize.define('products', {....},
    {
            tableName: 'products',
            deletedAt: 'deletedAt',
            paranoid: true,
            timestamps: true,
        }
    )
    
    // User relationship with product
    User.hasOne(Product,
        {
            as: 'Product',
            onDelete: 'CASCADE',
            hooks: true,
            foreignKey: "userID"
        })
    Product.belongsTo(User, {
        as: 'User',
        foreignKey: "userID"
    });

    【讨论】:

      【解决方案2】:

      我发现级联选项只设置了数据库级联选项。 sequelize 不会进行级联删除。

      但是sequelize 团队将来会在cascade for paranoid table 上工作。

      有一个未解决的问题:https://github.com/sequelize/sequelize/issues/2586

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 1970-01-01
        相关资源
        最近更新 更多