Python脚本仅写入MySQL SELECT查询最后一行的原因排查
问题分析:MySQL查询结果写入/tmp/route文件仅保留最后一行
我之前也踩过一模一样的坑!你说ifcfg-*系列文件都正常,唯独/tmp/route只留下最后一行查询结果,大概率是文件写入模式用错了,咱们来掰扯清楚:
核心原因
你处理route文件的时候,应该是在循环遍历MySQL查询结果的过程中,每次都用了'w'(覆盖写入)模式打开文件。举个简单的例子:假设你循环处理每一条路由记录,每次打开/tmp/route时都写open('/tmp/route', 'w'),那每一次写入都会把之前的内容完全覆盖,循环结束后自然就只剩最后一行了。
而ifcfg-*文件正常,是因为每个ifcfg文件对应单独的一条记录,每次处理一条记录就打开一个新的文件,用'w'模式没问题——毕竟每个文件只写一次,不存在覆盖的情况。
解决办法
给你两种靠谱的修复思路:
思路1:一次性打开文件,循环写入所有内容
先在循环前用'w'模式打开/tmp/route(顺便清空旧内容),然后在循环里把每一行路由记录都写进去,最后关闭文件。这样就彻底避免了覆盖问题:
import MySQLdb # 连接数据库(自行替换你的连接参数) db = MySQLdb.connect(host='your_host', user='your_user', passwd='your_pwd', db='your_db') cursor = db.cursor() # 执行你的查询语句 get_settings = """SELECT id_srv, vlan, phys_dev_srv, onboot, inet_ntoa(subnet_ipv4), prefix,...""" cursor.execute(get_settings) results = cursor.fetchall() # 正确写法:先打开文件,循环写入所有路由行 with open('/tmp/route', 'w') as route_file: for row in results: # 根据你的查询结果构造路由行(示例:假设子网和下一跳是对应字段) route_line = f"{row[4]}/{row[5]} via {your_next_hop_value}\n" route_file.write(route_line) cursor.close() db.close()
思路2:使用追加模式写入
如果因为某些原因需要在循环里每次打开文件,那把打开模式改成'a'(追加模式),这样每次写入都会把内容加到文件末尾,而不是覆盖:
for row in results: route_line = f"{row[4]}/{row[5]} via {your_next_hop_value}\n" # 用a模式追加,不会覆盖原有内容 with open('/tmp/route', 'a') as route_file: route_file.write(route_line)
注意:如果需要每次运行脚本都清空旧的路由文件,那在循环前可以先执行一次open('/tmp/route', 'w').close()来清空,再用追加模式写入。
额外排查点
如果上面的方法没解决,你可以先打印一下查询结果的行数,确认MySQL确实返回了4条记录——不过从ifcfg文件正常来看,查询结果应该是没问题的,大概率还是写入模式的问题。
内容的提问来源于stack exchange,提问作者alex podolin
相关产品推荐
相关产品推荐

