|
|
@@ -13,16 +13,19 @@ CLI:
|
|
|
python3 bin/datax-sync-template-gen.py \\
|
|
|
-ds postgresql/prod-hobby \\
|
|
|
-t public.card_group_order_info \\
|
|
|
- [-o [DIR]]
|
|
|
+ [-mask-conf <PATH>] [-o [DIR]]
|
|
|
|
|
|
参数:
|
|
|
- -ds 数据源 ref,形如 {db_type}/{env}-{实例简称}(同 sync ini 里
|
|
|
- dataSource 字段格式)。暂只支持 postgresql。
|
|
|
- -t schema 限定的表名,形如 schema.table(如 public.card_group_order_info)。
|
|
|
- -o 输出目录(可选):
|
|
|
- - 不传:stdout 同时打印 md 表 + ini 模板
|
|
|
- - 传 -o 不带值:workspace/{yyyymmdd}/,写两个文件 {table}.md + {table}.ini
|
|
|
- - 传 -o <DIR>:自定义目录,写两个文件
|
|
|
+ -ds 数据源 ref,形如 {db_type}/{env}-{实例简称}(同 sync ini
|
|
|
+ 里 dataSource 字段格式)。暂只支持 postgresql。
|
|
|
+ -t schema 限定的表名(如 public.card_group_order_info)。
|
|
|
+ -mask-conf mask 配置 ini 路径({table}.mask.ini,可选)。传入时按配置
|
|
|
+ 剔除 trim 字段 + 渲染 [mask] 段,md 脱敏类型列填好;不传时
|
|
|
+ 全字段输出,md 脱敏类型列空白。**文件不存在直接报错**。
|
|
|
+ -o 输出目录(可选):
|
|
|
+ - 不传:stdout 同时打印 md 表 + ini 模板
|
|
|
+ - 传 -o 不带值:workspace/{yyyymmdd}/,写 {table}.md + .ini
|
|
|
+ - 传 -o <DIR>:自定义目录,写两个文件
|
|
|
"""
|
|
|
import argparse
|
|
|
import os
|
|
|
@@ -105,7 +108,11 @@ def load_mask_conf(path):
|
|
|
method ∈ trim / md5 / month_trunc / mask_middle / keep_first_n / keep_last_n
|
|
|
- trim:整字段不入 raw(reader column 不查询)
|
|
|
- 其他:字段入 raw,由 dw_base.datax.mask 在 reader 端脱敏
|
|
|
+
|
|
|
+ 文件不存在直接 raise FileNotFoundError(不静默失败)。
|
|
|
"""
|
|
|
+ if not os.path.isfile(path):
|
|
|
+ raise FileNotFoundError('mask 配置不存在: ' + path)
|
|
|
cp = ConfigParser()
|
|
|
cp.read(path, encoding='utf-8')
|
|
|
if not cp.has_section('mask'):
|
|
|
@@ -196,7 +203,7 @@ def main():
|
|
|
help='schema 限定的表名(如 public.card_group_order_info)')
|
|
|
parser.add_argument('-o', nargs='?', const=WORKSPACE_DEFAULT, default=None, metavar='DIR',
|
|
|
help='输出目录(不传 stdout 同时打印 md 表 + ini 模板;不带值 workspace/{yyyymmdd}/ 写两文件;带值自定义目录写两文件)')
|
|
|
- parser.add_argument('--mask-conf', default=None, metavar='PATH',
|
|
|
+ parser.add_argument('-mask-conf', default=None, metavar='PATH', dest='mask_conf',
|
|
|
help='mask 配置 ini 路径({table}.mask.ini)。传入时按配置剔除 trim 字段 + 渲染 [mask] 段,md 脱敏类型列填好;不传时全字段输出,md 脱敏类型列空白')
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
@@ -226,6 +233,14 @@ def main():
|
|
|
|
|
|
# full_rows: [(attnum, attname, comment, pg_type, pk_flag), ...]
|
|
|
mask_dict = load_mask_conf(args.mask_conf) if args.mask_conf else {}
|
|
|
+
|
|
|
+ # mask 配置含表中不存在字段时 stderr 警告(不阻断)
|
|
|
+ pg_field_set = {r[1] for r in full_rows}
|
|
|
+ unknown_fields = [f for f in mask_dict if f not in pg_field_set]
|
|
|
+ if unknown_fields:
|
|
|
+ print('警告:mask 配置含表中不存在字段(已忽略): ' + ', '.join(unknown_fields),
|
|
|
+ file=sys.stderr)
|
|
|
+
|
|
|
trim_set = {f for f, m in mask_dict.items() if m == 'trim'}
|
|
|
non_trim_mask = {f: m for f, m in mask_dict.items() if m != 'trim'}
|
|
|
|