【问题标题】:Sequelize - I am getting error: "This version of MySQL doesn't yet support 'item type for JSON"Sequelize - 我收到错误:“此版本的 MySQL 尚不支持 'JSON 的项目类型”
【发布时间】:2019-04-17 14:15:40
【问题描述】:

我刚刚从 sequelize 版本 4.32.1 迁移到版本 5.6.1。在此更新之前一切正常。现在,我的几乎所有查询都在下面出现错误。

我的 MySQL 服务器版本是 5.7.25-0ubuntu0.16.04.2-log (Ubuntu),查询中表中的所有 db 列都没有 JSON 数据类型。

这是抛出错误的函数体。 “accountIds”的值是数字数组。

    let sqlQuery = `
        SELECT ua.*, page.page_id
        FROM user_instagram_fb_page_account ua
        LEFT JOIN user_facebook_page page ON page.id = ua.user_fb_page_id
        WHERE ua.user_account_ig_id IN($accountIds)
    `;
    return this._db.query(sqlQuery, {
        bind: {
            accountIds,
        },
        type: sequelize.QueryTypes.SELECT,
    });

还有错误:

  { Error: This version of MySQL doesn't yet support 'item type for JSON'
   at Packet.asError (/Volumes/ZoomSphereDEV/projects/zoomsphere2-api/node_modules/mysql2/lib/packets/packet.js:684:17)
   at Execute.execute (/Volumes/ZoomSphereDEV/projects/zoomsphere2-api/node_modules/mysql2/lib/commands/command.js:28:26)
   at Connection.handlePacket (/Volumes/ZoomSphereDEV/projects/zoomsphere2-api/node_modules/mysql2/lib/connection.js:449:32)
   at PacketParser.Connection.packetParser.p [as onPacket] (/Volumes/ZoomSphereDEV/projects/zoomsphere2-api/node_modules/mysql2/lib/connection.js:72:12)
   at PacketParser.executeStart (/Volumes/ZoomSphereDEV/projects/zoomsphere2-api/node_modules/mysql2/lib/packet_parser.js:75:16)
   at Socket.Connection.stream.on.data (/Volumes/ZoomSphereDEV/projects/zoomsphere2-api/node_modules/mysql2/lib/connection.js:79:25)
   at Socket.emit (events.js:189:13)
   at Socket.EventEmitter.emit (domain.js:441:20)
   at addChunk (_stream_readable.js:284:12)
   at readableAddChunk (_stream_readable.js:265:11)
   at Socket.Readable.push (_stream_readable.js:220:10)
   at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
 code: 'ER_NOT_SUPPORTED_YET',
 errno: 1235,
 sqlState: '42000',
 sqlMessage:
  'This version of MySQL doesn\'t yet support \'item type for JSON\'',
 sql:
  'SELECT ua.*, page.page_id FROM user_instagram_fb_page_account ua\n            LEFT JOIN user_facebook_page page ON page.id = ua.user_fb_page_id\n            WHERE ua.user_account_ig_id IN(?)' },

你能帮帮我吗?

【问题讨论】:

    标签: javascript mysql sequelize.js


    【解决方案1】:

    根据文档 [1],我需要用数组数据类型作为参数重写所有原始 SQL 查询,从“绑定”到“替换”。

    所以这个解决方案有效:

    const sqlQuery = `
        SELECT ua.*, page.page_id
        FROM user_instagram_fb_page_account ua
        LEFT JOIN user_facebook_page page ON page.id = ua.user_fb_page_id
        WHERE ua.user_account_ig_id IN(:accountIds)
    `;
    return this._db.query(sqlQuery, {
        replacements: {
            accountIds,
        },
        type: sequelize.QueryTypes.SELECT,
    });
    

    另一个可行的解决方案是使用模板文字:

    const sqlQuery = `
        SELECT ua.*, page.page_id
        FROM user_instagram_fb_page_account ua
        LEFT JOIN user_facebook_page page ON page.id = ua.user_fb_page_id
        WHERE ua.user_account_ig_id IN(${accountIds})
    `;
    return this._db.query(sqlQuery, {
        type: sequelize.QueryTypes.SELECT,
    });
    

    [1]http://docs.sequelizejs.com/manual/raw-queries.html

    【讨论】:

      【解决方案2】:

      我也遇到了这个问题,但是对于 mysql2 库,不是 sequelize - 而且我使用的是 JSON 字段。

      效果很好:

      UPDATE 表 SET 字段 = '{}' WHERE id = 1

      Mysql2 在我尝试运行时抛出了你得到的错误:

      UPDATE table SET field = '{}' WHERE id = 1 AND field = '{"key": "value"}'

      从 MySQL shell 运行此命令会产生一个有效的查询,但不会匹配任何行。

      我必须这样做才能让它工作:

      UPDATE table SET field = '{}' WHERE id = 1 AND field = CAST('{"key": "value"}' AS JSON)

      也许 sequelize 不得不改变他们的解析器。如果我是你,我会尝试将 accountIds 转换为带引号的字符串并尝试这样做。

      类似:

      return this._db.query(sqlQuery, {
        bind: {
          accountIds.map( (accountId) => {
            return `'${accountId}'`
          }).join(','),
        },
        type: sequelize.QueryTypes.SELECT,
      });
      

      【讨论】:

      • 嗨,我今天早上试过了。您的解决方案有效,但我根据文档找到了另一种解决方案。请参阅下面的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      相关资源
      最近更新 更多