sequelizejs删除行时保存对象

时间:2013-08-29 09:39:23

标签: javascript node.js sequelize.js

我有以下代码。我的想法是我在一个间隔中更新一个数据库行,但是如果我在这个脚本运行时从数据库中手动删除了行,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);


    })
})

1 个答案:

答案 0 :(得分:1)

我担心sequelize目前不支持你想要做的事。

错误回调仅适用于实际错误情况,即SQL语法错误,类似的东西。尝试更新不存在的行不是SQL中的错误。

这里的导入区别是,您正在程序之外修改数据库。 Sequelize无从得知!我有两种可能的解决方案,现在只有一种是可行的:

1(现在正常工作)

使用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语法seehere

2(在实施交易时将起作用

使用事务首先检查行是否存在,如果不存在则插入它。交易是续集的路线图,但目前不支持。如果您使用连接池,则可以通过调用sequelize.query('BEGIN / COMMIT TRANSACTION')手动执行交易。