mysqlnode.jssequelize.js

Create or Update Sequelize


I'm using Sequelize in my Nodejs project and I found a problem that I'm having a hard time to solve. Basically I have a cron that gets an array of objects from a server than inserts it on my database as a object ( for this case, cartoons ). But if I already have one of the objects, I have to update it.

Basically I have a array of objects and a could use the BulkCreate() method. But as the Cron starts again, it doesn't solve it so I was needing some sort of update with an upsert true flag. And the main issue: I must have a callback that fires just once after all these creates or updates. Does anyone have an idea of how can I do that? Iterate over an array of object.. creating or updating it and then getting a single callback after?

Thanks for the attention


Solution

  • From the docs, you don't need to query where to perform the update once you have the object. Also, the use of promise should simplify callbacks:

    Implementation

    function upsert(values, condition) {
        return Model
            .findOne({ where: condition })
            .then(function(obj) {
                // update
                if(obj)
                    return obj.update(values);
                // insert
                return Model.create(values);
            })
    }
    

    Usage

    upsert({ first_name: 'Taku' }, { id: 1234 }).then(function(result){
        res.status(200).send({success: true});
    });
    

    Note

    1. This operation is not atomic.
    2. Creates 2 network calls.

    which means it is advisable to re-think the approach and probably just update values in one network call and either:

    1. Look at the value returned (i.e. rows_affected) and decide what to do.
    2. Return success if update operation succeeds. This is because whether the resource exists is not within this service's responsibility.