本文介绍如何将不含表名的 json 配置文件(仅含列映射)与外部提供的表名列表进行动态绑定,生成形如 {表名: {'columns': {...}}} 的字典映射结构,适用于多表结构一致但名称动态的场景。
本文介绍如何将不含表名的 json 配置文件(仅含列映射)与外部提供的表名列表进行动态绑定,生成形如 {表名: {'columns': {...}}} 的字典映射结构,适用于多表结构一致但名称动态的场景。
在实际数据处理或 ETL 场景中,常遇到「多张逻辑结构相同、仅表名不同」的情况。此时为避免 JSON 配置冗余,可将共用的列定义提取为单一模板,并通过代码将该模板批量应用到一组表名上。这比在 JSON 中重复定义每个表更简洁、易维护。
假设 new_table.json 内容如下(注意:tables 数组中仅保留一个模板对象,不含 name 字段):
{
"tables": [
{
"columns": {
"column1": "name",
"column2": "address"
}
}
]
}
而你的运行时表名列表为:
table_list = ['abc', 'rfe', 'try']
由于所有表共享同一列结构,只需读取 mapping_data['tables'][0]['columns'] 一次,再将其与每个表名配对即可。推荐写法如下:
import json
table_list = ['abc', 'rfe', 'try']
try:
with open('new_table.json', 'r', encoding='utf-8') as f:
mapping_data = json.load(f)
# 安全获取模板列配置:确保 tables 非空且存在 columns 字段
template_table = mapping_data.get('tables', [{}])[0]
columns_template = template_table.get('columns', {})
# 构建映射字典:每个表名 → 共享列配置
table_mappings = {name: {'columns': columns_template} for name in table_list}
print(table_mappings)
except FileNotFoundError:
print("error: new_table.json 文件未找到")
except json.JSONDecodeError as e:
print(f"error: JSON 解析失败 — {e}")
except Exception as e:
print(f"error: 未知错误 — {str(e)}")
输出结果为:
{
'abc': {'columns': {'column1': 'name', 'column2': 'address'}},
'rfe': {'columns': {'column1': 'name', 'column2': 'address'}},
'try': {'columns': {'column1': 'name', 'column2': 'address'}}
}
✅ 关键要点说明:
- 不依赖 for table in ... 循环遍历 tables(因新 JSON 中无 name 字段,原写法会报错);
- 使用 mapping_data.get('tables', [{}])[0] 提供安全默认值,避免索引越界;
- 显式提取 columns_template 并复用,语义清晰、性能高效;
- 补充了针对性异常处理(文件缺失、JSON 格式错误),提升健壮性。
此模式可轻松扩展:例如支持多模板(按索引选择)、添加元数据字段(如 schema 或 primary_key),或结合 zip(table_list, templates) 实现差异化映射。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











