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

查询Domain的mx-record仅写入最后一条至数据库,求原因及解决方法

问题描述

从数据库中获取所有Domain记录,查询每个domain的MX记录并写入对应列,但数据库仅保存了每个domain的最后一条MX记录。现有代码如下:

domains = Domain.query.all()

for mx in domains:
    if mx:
        try:
            result = dns.resolver.resolve(mx.domain, 'MX')
            for mx_record in result:
                mx.mx_record = mx_record.to_text()
        except Exception as e:
            print(e)

        finally:
            db.session.commit()

期望数据库输出为每个domain对应所有MX记录用逗号分隔的内容,示例如下:

domainmx_record
cat.com10 mail5.cat.com.,10 mail6.cat.com.,10 mail1.cat.com.,10 mail4.cat.com.,10 mail2.cat.com.,10 mail3.cat.com.
stackoverflow.com10 alt4.aspmx.l.google.com.,5 alt1.aspmx.l.google.com.,10 alt3.aspmx.l.google.com.,5 alt2.aspmx.l.google.com.,1 aspmx.l.google.com.

问题原因

遍历result中的MX记录时,每次迭代都会用当前的mx_record.to_text()覆盖mx.mx_record的原有值,最终仅保留最后一条MX记录的内容,没有完成所有记录的拼接。

修复方案

先收集所有MX记录的文本内容,再用逗号拼接成字符串后赋值给mx.mx_record,修改后的代码如下:

domains = Domain.query.all()

for mx in domains:
    if mx:
        try:
            result = dns.resolver.resolve(mx.domain, 'MX')
            # 收集所有MX记录的文本内容
            mx_records = [record.to_text() for record in result]
            # 用逗号拼接成字符串
            mx.mx_record = ','.join(mx_records)
        except Exception as e:
            print(e)
            # 可选:查询失败时设置默认值,避免字段值异常
            mx.mx_record = ''
        finally:
            db.session.commit()

说明

  1. 通过列表推导式遍历所有MX记录,将每条记录转为文本存入列表
  2. 调用','.join()方法把列表元素拼接成逗号分隔的完整字符串,赋值给目标字段
  3. 异常分支可添加默认值设置,保证查询失败时字段内容可控

内容的提问来源于stack exchange,提问作者saogımsıgmdsıgnrdıfn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:15:37