使用 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,是的,但可能还不够。我删除了两个参数。没有成功。我可能会继续缩小范围。老实说,我认为这是mysql2
或MySQL
服务器变量的众所周知的问题
这个问题看起来更像是 node.js 语法问题,而不是 SQL 问题。
@IgorM 如果您知道答案,请写下答案。干杯。
【参考方案1】:
缩小查询范围后,我意识到这是一个愚蠢的语法问题。我要感谢 Nico Haase
和 Martin
对我的“头脑风暴”的帮助。
我很欣赏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 查询时出现异常的主要内容,如果未能解决你的问题,请参考以下文章