You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:15:47