NestJS+TypeORM环境下用LOAD DATA INFILE导入TXT到MySQL报错求助
解决NestJS+TypeORM中MySQL LOAD DATA INFILE导入报错方案
核心配置修正:正确传递mysql2驱动参数
TypeORM 0.3.x版本中,mysql2的连接参数需要放在DataSource配置的extra字段下,之前的错误大概率是参数没传对位置。以下是完整的DataSource配置示例:
// data-source.ts 或 app.module.ts 中的TypeORM配置 import { DataSource } from 'typeorm'; import * as fs from 'fs'; import * as path from 'path'; export const AppDataSource = new DataSource({ type: 'mysql', host: 'localhost', port: 3306, username: 'your_db_user', password: 'your_db_password', database: 'your_db_name', entities: [__dirname + '/../**/*.entity{.ts,.js}'], synchronize: false, extra: { // 开启LOCAL_FILES支持 flags: '+LOCAL_FILES', // 实现infileStreamFactory,返回文件读取流 infileStreamFactory: (filePath: string) => { // 转为绝对路径避免工作目录问题 const absolutePath = path.resolve(process.cwd(), filePath); return fs.createReadStream(absolutePath); }, }, });
确保MySQL服务端允许LOCAL INFILE
- 修改MySQL配置文件(my.cnf/my.ini),添加或修改:
重启MySQL服务生效。[mysqld] local_infile=1 - 给数据库用户授予FILE权限:
GRANT FILE ON *.* TO 'your_db_user'@'localhost'; FLUSH PRIVILEGES;
NestJS调度器中执行导入的代码示例
在调度器中直接使用TypeORM的DataSource.query()方法执行LOAD DATA语句,注意使用LOCAL关键字(文件在NestJS服务所在机器时必须加):
import { Injectable, Logger } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; import { DataSource } from 'typeorm'; @Injectable() export class ImportScheduler { private readonly logger = new Logger(ImportScheduler.name); constructor(private readonly dataSource: DataSource) {} @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT) async importTxtToDb() { try { const txtFilePath = './data/import_data.txt'; // 替换为你的文件路径 const importQuery = ` LOAD DATA LOCAL INFILE '${txtFilePath}' INTO TABLE your_target_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES; -- 若文件有表头,忽略第一行 `; await this.dataSource.query(importQuery); this.logger.log('TXT文件导入成功'); } catch (error) { this.logger.error('导入失败', error.stack); } } }
常见坑点排查
- 路径问题:确保txt文件路径是绝对路径,或相对于NestJS服务启动目录的相对路径,避免因工作目录变化导致找不到文件。
- 文件权限:NestJS进程所在用户需要有读取该txt文件的权限,Linux/macOS下可执行
chmod 644 your_file.txt调整权限。 - LOCAL关键字:文件在MySQL服务器端时去掉
LOCAL;在NestJS服务端时必须添加,否则会去MySQL服务器的文件系统查找文件。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

