续集 save() 问题
Sequelize save() issue
将 Sequelize 与 NodeJS 结合使用我发现模型上的 .save() 方法存在问题。
假设数据库 table 包含以下条目:
{ id : 1, name : "mary", enteredCompetition : 1, won : 0 }
{ id : 2, name : "mark", enteredCompetition : 1, won : 0 }
{ id : 3, name : "maya", enteredCompetition : 1, won : 0 }
{ id : 4, name : "maci", enteredCompetition : 0, won : 0 }
我检索了一位参赛用户,并将该用户设为中奖:
User.findOne( { where : { enteredCompetition : 1 } } )
.then( function( user ) {
user.won = 1;
user.save().then( function() {
// done
} );
} );
问题是此代码随后会继续更新数据库中 "enteredCompetition" 设置为 1 的所有用户。
我假设这与从 findOne 方法返回的模型对象的选项有关。 whereCollection 设置为 { enteredCompetition: 1 },因此我假设当对其调用 save() 时,它使用更新 sql:
中的条件
UPDATE `users` SET `won`=1,`updatedAt`='2015-08-19 09:59:27' WHERE `enteredCompetition` = 1
我的问题:这是预期的行为吗?我个人认为它只会更新它最初从数据库中提取的记录,但也许我缺少实现此目的的方法?
我目前的解决方案是使用原始查询返回的对象的 ID 再次调用 findOne,然后在此调用 save()。
尝试控制台记录用户并查看它包含什么
您使用的是什么版本的 Sequelize?我只是 运行 使用 3.5.1 进行了一个简单的测试,它的工作正如你所期望的那样。
开始 table:
+----+-------------+--------+
| id | username | type |
+----+-------------+--------+
| 1 | joshua f | NORMAL |
| 2 | joshua f jr | NORMAL |
+----+-------------+--------+
db.user.findOne({
where: {
type: 'NORMAL'
}
}).then(function(instance) {
instance.type = 'IRONMAN';
instance.save().then(function() {
console.log('saved');
});
});
给我以下 SQL:
UPDATE `users` SET `type`='IRONMAN',`updatedAt`='2015-08-20 05:07:49' WHERE `id` = 2
以及以下table
+----+-------------+---------+
| id | username | type |
+----+-------------+---------+
| 1 | joshua f | IRONMAN |
| 2 | joshua f jr | NORMAL |
+----+-------------+---------+
将 Sequelize 与 NodeJS 结合使用我发现模型上的 .save() 方法存在问题。
假设数据库 table 包含以下条目:
{ id : 1, name : "mary", enteredCompetition : 1, won : 0 }
{ id : 2, name : "mark", enteredCompetition : 1, won : 0 }
{ id : 3, name : "maya", enteredCompetition : 1, won : 0 }
{ id : 4, name : "maci", enteredCompetition : 0, won : 0 }
我检索了一位参赛用户,并将该用户设为中奖:
User.findOne( { where : { enteredCompetition : 1 } } )
.then( function( user ) {
user.won = 1;
user.save().then( function() {
// done
} );
} );
问题是此代码随后会继续更新数据库中 "enteredCompetition" 设置为 1 的所有用户。
我假设这与从 findOne 方法返回的模型对象的选项有关。 whereCollection 设置为 { enteredCompetition: 1 },因此我假设当对其调用 save() 时,它使用更新 sql:
中的条件UPDATE `users` SET `won`=1,`updatedAt`='2015-08-19 09:59:27' WHERE `enteredCompetition` = 1
我的问题:这是预期的行为吗?我个人认为它只会更新它最初从数据库中提取的记录,但也许我缺少实现此目的的方法?
我目前的解决方案是使用原始查询返回的对象的 ID 再次调用 findOne,然后在此调用 save()。
尝试控制台记录用户并查看它包含什么
您使用的是什么版本的 Sequelize?我只是 运行 使用 3.5.1 进行了一个简单的测试,它的工作正如你所期望的那样。
开始 table:
+----+-------------+--------+
| id | username | type |
+----+-------------+--------+
| 1 | joshua f | NORMAL |
| 2 | joshua f jr | NORMAL |
+----+-------------+--------+
db.user.findOne({
where: {
type: 'NORMAL'
}
}).then(function(instance) {
instance.type = 'IRONMAN';
instance.save().then(function() {
console.log('saved');
});
});
给我以下 SQL:
UPDATE `users` SET `type`='IRONMAN',`updatedAt`='2015-08-20 05:07:49' WHERE `id` = 2
以及以下table
+----+-------------+---------+
| id | username | type |
+----+-------------+---------+
| 1 | joshua f | IRONMAN |
| 2 | joshua f jr | NORMAL |
+----+-------------+---------+