使用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
相关产品推荐
相关产品推荐

