使用LOAD DATA LOCAL INFILE导入CSV报错:需提供streamFactory选项
解决LOAD DATA LOCAL INFILE 需streamFactory的问题
问题根源
node-mysql2 从v2.0版本开始,对LOAD DATA LOCAL INFILE做了安全限制,不再自动读取本地文件,必须显式配置streamFactory来提供文件读取流。
分步解决
1. 连接数据库时配置streamFactory
创建连接的时候,加上streamFactory选项,指定读取文件的逻辑:
const mysql = require('mysql2/promise'); const fs = require('fs'); async function getDbConnection() { const conn = await mysql.createConnection({ host: 'localhost', user: '你的用户名', password: '你的密码', database: '目标数据库', // 关键配置:添加streamFactory streamFactory: (filePath) => { return fs.createReadStream(filePath); }, // 必须开启这个选项,否则LOCAL INFILE会被禁用 enableLocalInfile: true }); return conn; }
2. 确保MySQL服务允许LOCAL INFILE
先执行这条SQL开启全局权限:
SET GLOBAL local_infile = 1;
3. 修正你的导入语句
原语句里的ENCLOSED BY '"'可以直接写'"',换行符用'\n'更兼容:
LOAD DATA LOCAL INFILE 'yob2019.csv' INTO TABLE baby_names FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
4. 检查文件路径与权限
- 用相对路径的话,要确认文件在VSCode终端的当前工作目录下,或者直接用绝对路径
- Linux/macOS下如果权限不够,执行
chmod +r yob2019.csv赋予读取权限
额外注意
如果你是用VSCode的MySQL扩展执行语句,有些扩展不支持自定义streamFactory配置,这种情况建议写个简单的Node.js脚本执行导入逻辑,避免扩展的限制。
内容的提问来源于stack exchange,提问作者Ziongeek
相关产品推荐
相关产品推荐

