批量导入TXT文件到MySQL时触发1054错误,求问题排查
解决MySQL 1054错误的问题
嘿,这个1054错误我太熟啦!咱们先搞清楚问题出在哪,再给你把代码改得更靠谱~
错误根源:SQL语句里的变量没正确传递
你写的cursor.execute('INSERT INTO clamp_test VALUES(default,file_content)')里,file_content被MySQL当成列名了,但你的clamp_test表只有ID和LastName两列,数据库找不到叫file_content的列,自然就触发1054错误啦。
正确的写法:参数化查询(推荐)
要让MySQL把file_content当成变量值,得用参数化查询的方式——这不仅能解决错误,还能防止SQL注入,安全性拉满。另外还有几个代码细节可以优化,比如不要每次循环都连数据库,太浪费资源了。
修正后的完整代码
import MySQLdb import os # 先定义好目标路径 target_path = "dir_path" file_list = os.listdir(target_path) # 把数据库连接放在循环外面,只建立一次连接 db = MySQLdb.connect("localhost", "root", "password", "myblog") cursor = db.cursor() try: for filename in file_list: # 用os.path.join拼接路径,避免Windows/Linux路径分隔符的兼容性问题 full_file_path = os.path.join(target_path, filename) # 用with语句自动管理文件资源,不用手动调用close with open(full_file_path, 'r') as file: # 读取一行内容,加strip()去掉多余的换行或空格 content = file.readline().strip() # 参数化查询:%s是占位符,后面的元组传递实际值 cursor.execute('INSERT INTO clamp_test (LastName) VALUES (%s)', (content,)) # 所有插入操作完成后统一提交 db.commit() print("所有文件内容导入成功!") except Exception as e: # 出错时回滚,避免产生脏数据 db.rollback() print(f"导入失败:{str(e)}") finally: # 无论成功失败,最后都要关闭游标和数据库连接 cursor.close() db.close()
额外优化点说明
- 参数化查询:用
%s占位符代替直接写变量,让数据库正确识别值而非列名,同时避免SQL注入风险。 - 连接复用:把数据库连接放在循环外,减少频繁建立/关闭连接的性能开销。
- 路径拼接:
os.path.join自动适配不同系统的路径分隔符,比手动拼接path+x更可靠。 - with语句:自动关闭文件,避免忘记close导致的资源泄漏问题。
- 异常处理:用try-except捕获错误并回滚,保证数据库的数据一致性。
内容的提问来源于stack exchange,提问作者nina_dev
相关产品推荐
相关产品推荐

