查询为空nodejs sequlize

bqujaahr  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(420)

我正在尝试更新nodejs应用程序中的数据。我和 Postman 试过了。
我的发展步骤是:
正在从db(mysql)获取id为10的数据以更新>>未处理的拒绝sequelizedatabaseerror:查询为空
我认出了,我用错了身份证,所以我换了一个正确的one:50 >>其他一些错误
好的,我修复了与我不准确的工作相关的其他错误,并使用good id:50>>unhandled rejection sequelizedabaseerror:unhandled rejection sequelizedabaseerror:query为空
奇怪的行为,因为这个身份证以前很好(在3。步骤)好的,我只是把id改成另一个正确的:51>>另一个错误
好的,我修复了另一个错误,用新的id:51>>未处理的拒绝sequelizedatabaseerror:查询为空重试更新
在我看来,我能得到有效的数据只有一次,在我不能达到它。。。完整堆栈跟踪:

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

思想?
笔记
我的问题与db型同步无关。这些都是同步的,因为我有一个案例-第一次调用-当我可以更新对象!但如果我测试两次,第三次等等。。。我得到了这个错误。因此,如果这些都没有同步,那么我也不能在第一次更新obejct
更新
去块一天后,我才认出,第二次和第三次sequalize做空sql查询。下面是代码片段:
好的sql更新:

Executing (default): UPDATE `cardModules` SET `field1`='xxxxxxxx',`field2`='xxxxxxxxxx',`field3`='MEDIUM',`field4`=false,`field5`=false WHERE `id` = 43

错误的sql更新:

Executing (default):

问题是:为什么Sequalize要这么做?

gjmwrych

gjmwrych1#

为了更清楚地说明这种情况是如何/为什么发生的:通常,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!!
mspsb9vt

mspsb9vt2#

我刚意识到问题的小时数。如果sequlize没有发现db值和可更新值之间的任何差异,那么将生成一个空sql字符串并希望执行此操作。因此,由于相同的sequlize抛出的查询是空消息。
因此,如果没有更改,但您希望更新,则会出现此错误。
我处理此问题是为了检查错误消息,如:

if(err.message == 'Query was empty'){
                console.log('There is no changes in the update, lets continue the progress...');
                next();
            }

相关问题