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

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

  1. 修改MySQL配置文件(my.cnf/my.ini),添加或修改:
    [mysqld]
    local_infile=1
    
    重启MySQL服务生效。
  2. 给数据库用户授予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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:05:33