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

使用LOAD DATA LOCAL INFILE批量导入TXT到MySQL遇1064错误求助

咱们一步步来排查你的问题,先拆解代码里的错误,再给你匹配需求的解决方案:

你代码里的几个关键错误(1064报错的根源也在这里)

  • SQL语法硬伤:你在LOAD DATA语句里直接写了file变量,MySQL会把它当成字符串字面量,而不是你实际的文件路径,直接触发语法错误。另外你的ID是自增字段,不需要在导入时指定,数据库会自动生成,所以INTO后面只需要写LastName就行。
  • 文件操作逻辑错误:os.path.join('path\\'+x)是错误用法,os.path.join本身会自动处理路径分隔符,应该写成os.path.join("path", x)。而且你得到的file是路径字符串,不是打开的文件对象,调用file.close()肯定会报错——字符串根本没有close方法,何况这里也不需要手动打开文件。
  • 数据库连接管理混乱:把db.connect()放在循环里,每次处理一个文件都新建连接,既低效又容易导致连接泄漏。最后一行db.close还少了括号,应该是db.close(),否则不会实际关闭连接。
  • 需求匹配错误:如果你要的是「每个文件的全部内容对应数据库里的一行记录」,那LOAD DATA根本不适合——它是把文件内部的每一行拆成一条记录,和你的需求完全相反。

修正后的代码(匹配「每个文件对应一行记录」的需求)

这是最贴合你描述的方案,用Python读取每个文件的全部内容,再通过参数化插入到数据库,还能避免SQL注入和特殊字符问题:

import MySQLdb
import os

# 替换成你的实际配置
DB_HOST = "localhost"
DB_USER = "root"
DB_PASS = "password"
DB_NAME = "myblog"
FILE_DIR = "path"  # 你的TXT文件所在目录

# 建立一次连接,循环复用
try:
    db = MySQLdb.connect(
        host=DB_HOST,
        user=DB_USER,
        passwd=DB_PASS,
        db=DB_NAME,
        charset='utf8mb4'  # 根据数据库编码调整,比如utf8
    )
    cursor = db.cursor()
    
    # 只处理TXT文件
    for filename in os.listdir(FILE_DIR):
        if filename.lower().endswith(".txt"):
            file_path = os.path.join(FILE_DIR, filename)
            # 读取文件全部内容(注意编码,比如你的文件是gbk就改成encoding='gbk')
            try:
                with open(file_path, 'r', encoding='utf8') as f:
                    content = f.read().strip()  # 可选:去掉首尾空白/换行,按需调整
                
                # 参数化查询,避免SQL注入和特殊字符问题
                sql = "INSERT INTO clamp_test (LastName) VALUES (%s)"
                cursor.execute(sql, (content,))
                db.commit()
                print(f"✅ 成功导入:{filename}")
            
            except Exception as e:
                print(f"❌ 处理{filename}失败:{str(e)}")
                db.rollback()

except Exception as e:
    print(f"❌ 数据库连接失败:{str(e)}")

finally:
    # 确保关闭资源
    if 'cursor' in locals():
        cursor.close()
    if 'db' in locals():
        db.close()

关于导入方式的正确性

  • 如果你的需求是「每个文件对应数据库一行记录」,上面的方案是完全正确的。之前你用INSERT报错「无法插入过多行」,大概率是因为你一次性拼接了太多VALUES导致SQL语句过长,现在每次插入一行就不会有这个问题。
  • 如果你实际需求是「每个文件内的每一行对应一条记录」,那LOAD DATA是更高效的选择,但需要修正语法和配置:
    # 针对文件内每行一条记录的LOAD DATA代码片段
    sql = f"""
        LOAD DATA LOCAL INFILE '{file_path}'
        INTO TABLE clamp_test (LastName)
        LINES TERMINATED BY '\n'  # Windows系统改成'\r\n'
        IGNORE 0 LINES  # 有表头的话改成IGNORE 1 LINES
    """
    cursor.execute(sql)
    
    注意:使用LOAD DATA LOCAL需要在连接时指定local_infile=True,同时MySQL服务器配置要开启local_infile=1。

内容的提问来源于stack exchange,提问作者nina_dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:55:54