#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2023/4/27 6:21 # @Author : old tom # @File : pdman_reader.py # @Project : py-xltpl # @Desc : 读取pdman 文件 from futool.core.fh_file_path import exist import json class PDmanReader(object): DATA_TYPE_MAPPING = { 'oracle': { 'DefaultString': 'VARCHAR2(255)', 'IdOrKey': 'VARCHAR2(32)', 'Name': 'VARCHAR2(90)', 'Int': 'NUMBER(38,0)', 'Double': 'NUMBER(24,6)', 'Money': 'NUMBER(24,6)', 'DateTime': 'DATE', 'YesNo': 'VARCHAR2(1)', 'Dict': 'VARCHAR2(32)', 'DescText': 'VARCHAR2(900)' } } class PDfileNotExistError(Exception): """ PDMAN 文件不存在 """ def __init__(self, msg): Exception.__init__(self, msg) class ModuleNotExistError(Exception): """ 模块不存在 """ def __init__(self, msg): Exception.__init__(self, msg) def __init__(self, pdman_file): if not exist(pdman_file): raise self.PDfileNotExistError(msg=f'{pdman_file}文件不存在') with open(pdman_file, 'r', encoding='utf-8') as f: self.json_reader = json.loads(f.read()) self.modules = self._load_all_module() self.domains = self._load_data_domains() def read_by_module(self, module_name): """ 根据模块读取 :param module_name: 模块名称 :return: """ if module_name not in self.modules.keys(): raise self.ModuleNotExistError(f'{module_name}模块不存在') # 获取模块与表关联关系 entry_ids = self.modules[module_name] tables = {} for entry in self.json_reader['entities']: if entry['id'] in entry_ids: # 读取表名,字段 tables[entry['defKey']] = { 'table_name': entry['defName'], 'table_en_name': entry['defKey'], 'rows': self._fields_convert(entry['fields']) } return tables def _load_all_module(self): """ 加载模块索引 :return: """ modules = self.json_reader['viewGroups'] module_dict = {} for m in modules: module_dict[m['defKey']] = m['refEntities'] return module_dict def _load_data_domains(self, db_type='oracle'): """ 加载数据域 :return: """ domains_dict = {} domains = self.json_reader['domains'] for d in domains: domains_dict[d['id']] = self.DATA_TYPE_MAPPING[db_type][d['defKey']] return domains_dict # def _fields_convert(self, fields): rt = [] for f in fields: if 'domain' in f.keys() and len(f['domain']) > 0: f['type'] = self.domains[f['domain']] elif len(str(f['len'])) > 0 and len(str(f['scale'])) == 0: f['type'] = f['type'] + '(' + str(f['len']) + ')' elif len(str(f['len'])) > 0 and len(str(f['scale'])) > 0: f['type'] = f['type'] + '(' + str(f['len']) + ',' + str(f['scale']) + ')' rt.append({'enName': f['defKey'], 'chName': f['defName'] + ';' + f['comment'] if len(f['comment']) > 0 else f['defName'], 'type': f['type'], 'nullable': 'Y' if f['notNull'] else 'N'}) return rt # if __name__ == '__main__': pdfile = r'C:\Users\89295\Desktop\昭通OA.pdma.json' reader = PDmanReader(pdfile) all_table = reader.read_by_module('OA_CAR') print(all_table)