Sequelize使用自定义where子句的upsert函数

时间:2016-05-27 01:50:44

标签: node.js postgresql sequelize.js

我使用Sequelize与我的postgres数据库进行通信。我想使用upsert功能,但使用custom where子句。例如,我有志愿者位置的这个模型

module.exports = function (sequelize, DataTypes) {
    var volunteer_location = sequelize.define('volunteer_location', {
        id: {
            type: Sequelize.INTEGER,
            allowNull: false,
            autoIncrement: true,
            primaryKey: true
        },
        deviceId: {
            allowNull: false,
            type: Sequelize.STRING
        },
        latitude: {
            allowNull: false,
            type: Sequelize.DECIMAL(18, 14)
        },
        longitude: {
            allowNull: false,
            type: Sequelize.DECIMAL(18, 14)
        },
        city: {
            allowNull: false,
            type: Sequelize.STRING(90)
        },
        state: {
            type: Sequelize.STRING(90)
        },
        postalCode: {
            type: Sequelize.STRING(16)
        },
        country: {
            allowNull: false,
            type: Sequelize.STRING(70)
        }
    }, {
        instanceMethods: {
            insertOrUpdate: function (requestBody, res) {
                volunteer_location.upsert(requestBody).then(function () {
                    res.sendStatus(200);
                });
            }
        }
    });
    return volunteer_location;
};

insertOrUpdate方法中,我尝试使用upsert给json像

location = {
    deviceId: req.body.deviceId,
    latitude: req.body.latitude,
    longitude: req.body.longitude,
    city: req.body.city,
    state: req.body.state,
    postalCode: req.body.postalCode,
    country: req.body.country,
    volunteer: req.decoded.id
};

志愿者来自表格foreign keyusers。 现在执行说:

  

创建或替换函数pg_temp.sequelize_upsert()返回整数   AS $ func $ BEGIN INSERT INTO“volunteer_locations”一些值 RETURN   1;独特的例外,然后更新“志愿者位置”   SET 一些值 WHERE((“id”IS NULL AND“志愿者”= 1));   返回2;结束; $ func $ LANGUAGE plpgsql; SELECT * FROM   pg_temp.sequelize_upsert();

idvolunteer是一组主键。我想通过仅检查WHERE值来更改UPDATE上的volunteer条款,因为我不知道id的值。

这可能吗?或者我必须使用

findOne(...).then(function () {
      //update
});

修改

我使用属性volunteer设置unique: true,并将where子句替换为WHERE (("id" IS NULL AND "volunteer" = 1) OR "volunteer" = 1);,这意味着更新有效。但我不知道这是否非常有效。如果有人知道更好的解决方案,请告诉我。

0 个答案:

没有答案