我正在尝试更新nodejs应用程序中的数据。我用邮递员测试了它。
我的发展步骤是:
从DB(MySQL)获取id为10的数据以更新>>未处理的拒绝SequelizeDatabaseError:查询为空
我认识到,我使用了错误的ID,所以我改为正确的:50>>其他一些错误
在我看来,在我无法达到它之后,我只能获得一次有效数据...... 完整的堆栈跟踪:
Unhandled rejection SequelizeDatabaseError: Query was empty
at Query.formatError (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\sequelize\lib\dialects\mysql\query.js:223:16)
at Query.connection.query [as onResult] (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\sequelize\lib\dialects\mysql\query.js:55:23)
at Query.Command.execute (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\mysql2\lib\commands\command.js:30:12)
at Connection.handlePacket (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\mysql2\lib\connection.js:515:28)
at PacketParser.onPacket (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\mysql2\lib\connection.js:94:16)
at PacketParser.executeStart (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\mysql2\lib\packet_parser.js:77:14)
at Socket.<anonymous> (C:\Users\bla_bla_bla\Documents\work\_nodejs\parentfolder\application\application\node_modules\mysql2\lib\connection.js:102:29)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:547:20
想法?
注意
我的问题与模型数据库同步无关。这些是同步的,因为我有一个案例 - 第一次调用 - 当我可以更新对象时!但如果我测试那个id两次,第三次等......我得到了这个错误。所以,如果这些都不是同义词,那么我无法在第一次更新obejct
更新
经过一天的讨论,我刚刚认识到,第二次和第三次sequlize进行空SQL查询。在代码片段下面:
良好的SQL更新:
Executing (default): UPDATE `cardModules` SET `field1`='xxxxxxxx',`field2`='xxxxxxxxxx',`field3`='MEDIUM',`field4`=false,`field5`=false WHERE `id` = 43
错误的SQL更新:
Executing (default):
问题是:为什么Sequlize这个?
答案 0 :(得分:4)
我刚刚发现问题的小时数。如果sequlize没有发现DB值和可更新值的任何差异,那么将生成一个空的SQL字符串并想要执行它。因此,相同的sequlize抛出此查询为空消息。
因此,如果没有更改但您想要更新,则会收到此错误。
我处理此问题以检查错误消息,如:
if(err.message == 'Query was empty'){
console.log('There is no changes in the update, lets continue the progress...');
next();
}
答案 1 :(得分:2)
要更多地了解如何/为什么发生这种情况:通常,Sequelize将跟踪对模型的更改,然后在调用model.save()时,它将仅尝试更新SQL列。已经改变了。
let person = async Employee.findOne();
person.name = "Jerry Jones";
person.save(); //All good here, and only the name column will be updated
如果没有任何属性更改,它甚至不会尝试进行SQL调用
let person = async Employee.findOne();
person.save(); //No errors, but no SQL call will be made
但是,任何设置为“ undefined”值(不同于null的值)的属性仍将导致模型被标记为脏/已更改,但在构造SQL调用时将被忽略。因此,如果仅更改一个属性并将其设置为undefined,Sequelize仍会尝试进行调用,但查询将为空。
let userUpdates = {age: 99, title: "Developer"};
let person = async Employee.findOne();
person.name = userUpdates.name; //name is undefined, but property will still be considered changed.
person.save(); //Query will be empty!!