0

我有以下代码。这个想法是我在一个间隔内更新一个数据库行,但是如果我在这个脚本运行时手动从数据库中删除该行,save() 仍然会进入success(),但该行实际上并没有放回数据库. (因为 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);


    })
})
4

1 回答 1

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实现语法,请参见此处

2(将在执行事务时工作

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

于 2013-09-01T16:48:53.627 回答