使用 mysql2 运行大型 INSERT 查询时出现异常

Posted

技术标签:

【中文标题】使用 mysql2 运行大型 INSERT 查询时出现异常【英文标题】:Exception when running large INSERT query with mysql2 【发布时间】:2019-12-02 18:05:17 【问题描述】:

我使用mysql2 包对 MySQL 服务器运行查询

这里是连接设置

getConnection: function () 


   let host = "hostname.com";
   let database = "database_name";
   let username = "username";
   let password = "pwd";


   let con = mysql.createConnection(
      host: host,
      user: username,
      password: password,
      database: database,
      connectTimeout: 15000
   );

   return con;
,

它适用于所有查询,除了 INSERT 带有 26 个参数的查询:

    recordCreate: function (con, param1, param2,
       param3,  param4,  param5,  param6,  param7,
       param8,  param9,  param10, param11, param12,
       param13, param14, param15, param16, param17,
       param18, param19, param20, param21, param22,
       param23, param24, param25, param26, callback) 
       try 
         con.connect(function (err, result) 
                 try 
                      if (err) throw err;
                      con.query(“INSERT INTO tbldata (param1,
                           param2,  param3,  param4,  param5,  param6,
                           param7,  param8,  param9,  param10, param11,
                           param12, param13, param14, param15, param16,
                           param17, param18, param19, param20, param21,
                           param22, param23, param24, param25, param26
                   ) VALUES 
                   (?, ?, ?, ?, ?,
                    ?, ?, ?, ?, ?,
                    ?, ?, ?, ?, ?,
                    ?, ?, ?, ?, ?,
                    ?, ?, ?, ?, ?,
                    ?)”,[param1,  param2,  param3,  param4,  param5,
                         param6,  param7,  param8,  param9,  param10,
                         param11, param12, param13, param14, param15,
                         param16, param17, param18, param19, param20,
                         param21, param22, param23, param24, param25,
                         param26]
       , function (err) 
          try 
             if (err) throw err;
             callback(true);
           catch (err) 
             callback(err);
           finally 
             con.close();
          
  );

我不断收到以下错误消息:

C:\MyProjects\TMS\node_modules\mysql2\lib\commands\command.js:30 this.onResult(err); ^

TypeError: this.onResult 不是函数 在 Query.execute (C:\MyProjects\TMS\node_modules\mysql2\lib\commands\command.js:30:14) 在 Connection.handlePacket (C:\MyProjects\TMS\node_modules\mysql2\lib\connection.js:449:32) 在 PacketParser.Connection.packetParser.p [as onPacket] (C:\MyProjects\TMS\node_modules\mysql2\lib\connection.js:72:12) 在 PacketParser.executeStart (C:\MyProjects\TMS\node_modules\mysql2\lib\packet_parser.js:76:16) 在 Socket.Connection.stream.on.data (C:\MyProjects\TMS\node_modules\mysql2\lib\connection.js:79:25) 在 Socket.emit (events.js:188:13) 在 addChunk (_stream_readable.js:288:12) 在 readableAddChunk (_stream_readable.js:269:11) 在 Socket.Readable.push (_stream_readable.js:224:10) 在 TCP.onStreamRead [as onread] (internal/stream_base_commons.js:145:17)

进程以退出代码 1 结束

重要的是要说明这些数据元素(参数)非常小。我们在这里讨论短 10 字符的字符串和数字

例如

INSERT INTO tbldata (param1,  param2,  param3,  param4,  param5,
                     param6,  param7,  param8,  param9,  param10,
                     param11, param12, param13, param14, param15,
                     param16, param17, param18, param19, param20,
                     param21, param22, param23, param24, param25,
                     param26) VALUES 
                    (51, 'Test 51', '', '2019-12-01', '2019-12-01',
                      1, 1, 1, 3, 3, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 
                      0, 1, 1, 1, 3, 3);

我尝试在 MySQL 服务器上运行示例查询,它运行良好

【问题讨论】:

您是否尝试将查询范围缩小到更少的参数?哪里开始出错了? 对我来说毫无意义 TypeError: this.onResult is not a function at Query.execute 但 surley 它应该对节点人有意义 @NicoHaase,是的,但可能还不够。我删除了两个参数。没有成功。我可能会继续缩小范围。老实说,我认为这是mysql2MySQL 服务器变量的众所周知的问题 这个问题看起来更像是 node.js 语法问题,而不是 SQL 问题。 @IgorM 如果您知道答案,请写下答案。干杯。 【参考方案1】:

缩小查询范围后,我意识到这是一个愚蠢的语法问题。我要感谢 Nico HaaseMartin 对我的“头脑风暴”的帮助。

我很欣赏mysql2 团队的工作。我也希望他们能解决 query 方法获取超过 2 个参数的问题。

con.query("INSERT INTO tbldata (" +
                                "param1, " +
                                "param2, " +
                                "param3, " +
                                "param4, ", -- here is the syntax issue. Comma instead of plus
                                "param5) VALUES (?, ?, " +
                                "?, ?, " +
                                "?, ?, " +
                                "?)",
                                [param1,
                                    param2,
                                    param3,
                                    param4,
                                    param5]

【讨论】:

我建议使用对象作为单个参数或命名占位符。 github.com/mysqljs/mysql#getting-the-id-of-an-inserted-row 和 github.com/sidorares/node-mysql2/blob/master/documentation/…

以上是关于使用 mysql2 运行大型 INSERT 查询时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB 在使用大型 WHERE IN 时崩溃

在大型数据集上使用 JOIN 运行 SQL 查询

尝试使用 mysql2 gem 安装应用程序时出错

编写快速 MySQL INSERT 查询或优化此查询

在云中跨大型 JSON 数据集运行类似 SQL 的查询?

问:编写使用 mysql2 查询的 GraphQL 解析器