我有以下代码。我的想法是我在一个间隔中更新一个数据库行,但是如果我在这个脚本运行时从数据库中手动删除了行,save()仍然会成功(),但该行实际上并没有放回到数据库中。 (因为sequelize使用where子句进行更新查询,并且没有行匹配。)我期望创建一个新行或调用error()。我能做些什么来让这个表现得像我想要的那样?
var Sequelize = require("sequelize")
, sequelize = new Sequelize('test', 'test', 'test', {logging: false, host: 'localhost'})
, Server = sequelize.import(__dirname + "/models/Servers")
sequelize.sync({force: true}).on('success', function() {
Server
.create({ hostname: 'Sequelize Server 1', ip: '127.0.0.1', port: 0})
.on('success', function(server) {
console.log('Server added to db, going to interval');
setInterval(function() { console.log('timeout reached'); server.port = server.port + 1; server.save().success(function() { console.log('saved ' + server.port) }).error(function(error) { console.log(error); }); }, 1000);
})
})
答案 0 :(得分:1)
我担心sequelize目前不支持你想要做的事。
错误回调仅适用于实际错误情况,即SQL语法错误,类似的东西。尝试更新不存在的行不是SQL中的错误。
这里的导入区别是,您正在程序之外修改数据库。 Sequelize无从得知!我有两种可能的解决方案,现在只有一种是可行的:
使用sequelize.query
在查询中包含错误处理
IF EXISTS (SELELCT * FROM table WHERE id = 42)
UPDATE table SET port = newport WHERE id = 42
ELSE
INSERT INTO table ... port = newport
或者,您可以在sequelize github上创建一个功能请求,以实现INSERT ... ON DUPLICATE KEY UPDATE
语法see和here
使用事务首先检查行是否存在,如果不存在则插入它。交易是续集的路线图,但目前不支持。如果您不使用连接池,则可以通过调用sequelize.query('BEGIN / COMMIT TRANSACTION')
手动执行交易。