我使用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 key
,users
。
现在执行说:
创建或替换函数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();
id
和volunteer
是一组主键。我想通过仅检查WHERE
值来更改UPDATE
上的volunteer
条款,因为我不知道id
的值。
这可能吗?或者我必须使用
findOne(...).then(function () {
//update
});
修改
我使用属性volunteer
设置unique: true
,并将where子句替换为WHERE (("id" IS NULL AND "volunteer" = 1) OR "volunteer" = 1);
,这意味着更新有效。但我不知道这是否非常有效。如果有人知道更好的解决方案,请告诉我。