ExpressJS+mysql2使用LOAD DATA LOCAL INFILE报错:需提供streamFactory选项
解决LOAD DATA LOCAL INFILE的streamFactory缺失错误
从mysql2 v2.0版本开始,使用LOAD DATA LOCAL INFILE命令时,不再允许让数据库服务器直接读取本地文件路径,必须通过streamFactory选项提供文件读取流。以下是修复后的代码:
首先确保引入fs模块(用于创建文件读取流),然后修改查询函数和调用逻辑:
修改后的query函数
const fs = require('fs'); async function query(sql, streamOptions = null) { console.log("querying"); // 连接配置中开启localInfile,并创建连接 const conn = await mysql.createConnection({ ...config.db, localInfile: true }); conn.on("error", (err) => console.log(err)); const queryConfig = { sql: sql, values: [] }; // 如果传入了流配置,添加到查询参数中 if (streamOptions?.streamFactory) { queryConfig.streamFactory = streamOptions.streamFactory; } const [results, ] = await conn.query(queryConfig); await conn.end(); // 执行完查询后关闭连接,避免资源泄漏 return results; }
调用query函数的代码
query( "LOAD DATA LOCAL INFILE 'placeholder.csv' INTO TABLE jr " + " FIELDS TERMINATED BY ','" + " LINES TERMINATED BY '\n'" + " IGNORE 1 ROWS;", { // 传入读取CSV文件的流工厂函数 streamFactory: () => fs.createReadStream(req.file.path) } ).then(r => console.log("Inserted")) .catch(err => console.error("插入失败:", err));
关键注意点
- 必须在连接配置中设置
localInfile: true,否则LOAD DATA LOCAL INFILE命令会被数据库客户端禁用。 streamFactory是一个返回fs.ReadStream的函数,mysql2会通过这个流读取文件内容,SQL语句中的文件名仅作为占位符使用(可以任意填写,不影响实际读取的文件)。- 每次查询后记得调用
conn.end()关闭连接,防止连接池耗尽或资源泄漏。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

