我正在尝试更新 Nodejs 应用程序中的数据。我和邮递员测试过。
我的开发步骤是:
从数据库(MySQL)获取id为10的数据进行更新>>未处理的拒绝SequelizeDatabaseError:查询为空
我认识到,我使用了错误的ID,所以我改成了正确的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 两次、第三次等...我会收到此错误。因此,如果这些不同步,那么我也无法在第一时间更新对象
更新
经过一天的debbing,我才发现,第二次和第三次sequulize生成了空的SQL查询。下面是代码片段:
良好的 SQL 更新:
Executing (default): UPDATE `cardModules` SET `field1`='xxxxxxxx',`field2`='xxxxxxxxxx',`field3`='MEDIUM',`field4`=false,`field5`=false WHERE `id` = 43
糟糕的 SQL 更新:
Executing (default):
问题是:为什么要进行 Sequlize?
为了更清楚地了解如何/为什么会发生这种情况:通常,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
但是,任何设置为“未定义”值(与 null 不同!)的属性仍将导致模型被标记为脏/已更改,但在构造 SQL 调用时将被忽略。因此,如果您只更改一个属性并将其设置为未定义,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!!
我刚刚意识到问题的小时数。如果 sequlize 在数据库值和可更新值中没有发现任何差异,那么将生成一个空的 SQL 字符串并想要执行它。因此,相同的 sequlize 会抛出此 Query wasempty 消息。
因此,如果没有任何更改但您想更新,您将收到此错误。
我处理这个问题是为了检查错误消息,例如:
if (err.message == 'Query was empty'){
console.log('There is no changes in the update, lets continue the progress...');
next();
}