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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:27:27