【问题标题】:Query was empty Nodejs Sequlize查询为空 Node Js Sequelize
【发布时间】:2022-01-19 02:58:18
【问题描述】:

我正在尝试更新 nodejs 应用程序中的数据。我用邮递员测试了它。

我的开发步骤是:

  1. 从数据库(MySQL)获取id为10的数据以更新>>未处理的拒绝SequelizeDatabaseError:查询为空

  2. 我认出来了,我用错了id,所以我改了一个正确的:50 >> 其他一些错误

  3. 好的,我修复了与我的不准确工作相关的其他一些错误,并使用了良好的 id:50 >> 未处理的拒绝 SequelizeDatabaseError:未处理的拒绝 SequelizeDatabaseError:查询为空
  4. 奇怪的行为,因为这个 id 之前很好......(在 3. 步骤中)好吧,我只是将 id 更改为另一个正确的:51 >> 其他错误
  5. 好的,我修复了另一个错误,使用新的新 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

想法?

注意

我的问题与模型数据库同步无关。这些是同步的,因为我有一个案例 - 第一次调用 - 当我可以更新对象时!但是,如果我测试该 id 两次、第三次等...我会收到此错误。所以,如果这些都没有同步,那么我也无法在第一时间更新对象

更新

debbing 一天后,我才发现,第二次和第三次 sequlize 进行空 SQL 查询。下面是sn-ps的代码:

良好的 SQL 更新:

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

糟糕的 SQL 更新:

Executing (default):

问题是:为什么要 Sequlize 这个?

【问题讨论】:

  • @BinitGhetiya 我以前检查过这篇文章。在这个 cade 中有一个未定义的字段错误,但在我的情况下,我的所有字段都已填写。我得到了数据,但只有一个,第二个我得到这个 &*@{Đ@& 错误:查询为空。
  • 请再次确认您的所有表列都在类(模型)中定义
  • @BinitGhetiya 我的问题与模型数据库同步无关。这些是同步的,因为我有一个案例 - 第一次调用 - 当我可以更新对象时!但是,如果我测试该 id 两次、第三次等...我会收到此错误。所以,如果这些都没有同步,那么我也无法在第一时间更新对象。
  • 了解您的查询,能否请您也将其添加到描述中。

标签: javascript mysql node.js sequelize.js postman


【解决方案1】:

我刚刚认识到问题的小时数。如果 sequlize 在 DB 值和可更新值中没有发现任何差异,则将生成一个空 SQL 字符串并希望执行此操作。所以因为这个相同的 sequlize 会抛出这个 Query was empty 消息。

所以如果没有更改但你想更新,你会得到这个错误。

我处理这个问题是为了检查错误信息,例如:

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

【讨论】:

    【解决方案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
    

    但是,任何设置为“未定义”值(与 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!!
    

    【讨论】:

      猜你喜欢
      • 2019-09-05
      • 1970-01-01
      • 2016-11-25
      • 2021-12-18
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2020-09-23
      相关资源
      最近更新 更多