查询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记录用逗号分隔的内容,示例如下:
| domain | mx_record |
|---|---|
| cat.com | 10 mail5.cat.com.,10 mail6.cat.com.,10 mail1.cat.com.,10 mail4.cat.com.,10 mail2.cat.com.,10 mail3.cat.com. |
| stackoverflow.com | 10 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()
说明
- 通过列表推导式遍历所有MX记录,将每条记录转为文本存入列表
- 调用
','.join()方法把列表元素拼接成逗号分隔的完整字符串,赋值给目标字段 - 异常分支可添加默认值设置,保证查询失败时字段内容可控
内容的提问来源于stack exchange,提问作者saogımsıgmdsıgnrdıfn
相关产品推荐
相关产品推荐

