简述

目前在银行研发中心做项目管理工作。我们单位的项目经理从需求、设计、编码到测试以及上线,都要有很大程度的参与。没有工具支持,很多事根本忙不过来、或者没法在有限的时间里保证项目质量。

大概半年前开始接触PYTHON,多多少少写了一些能与项目结合使用的小工具。

从自动化交易接口生成工具,到一些适合我们项目使用的测试工具。

因为项目性质,我手头大部分活儿都是C平台上开发的,我自己也是对C比较熟。 使用PYTHON之后,感觉大好,比起用C实现,一些想法能以快得多的速度用python得以落实或验证,PDMHandler是这些小程序中的一个。

目前此代码托管在GitHub上:

源码地址:git@github.com:petjiang/PDMHandler.git

编写背景

我们项目常用PowerDesigner做项目的数据建模管理。

银行对运行中的系统管理是比较严格的,若部署产生问题,可能波及到客户关系、舆情、账务等,风险不小,所以对项目组的要求也十分严苛。

银行系统由于可靠性要求高,所以技术上不会用到最前延的。但业务需求通常较为复杂、而且变化快,数据模型变化相应也就频繁。

目的

我们常见的使用场景,就是修改PowerDesigner模型文件(.pdm),转成SQL,在开发环境上变更数据库实例、业务代码开发。

大量并发需求来时,pdm常被改乱,时间一长pdm与数据库实例的一致性就不能得到保证了。一些较大型的系统几百上千张表,靠人工核对一致性是很苦的体力活儿。

PDMHandler实现的API可以解决这个过程中的SQL生成、PDM与数据库实例的比对、在unix环境下查看pdm数据字典等功能。

实现原理

其实,实现原理还是比较简单的。

只需要突破一个关键点:

PowerDesigner的模型文件(.pdm文件)实际上是一个标准的XML数据文件

没想到吧?:)

一但了解了这一点,实现对.pdm文件的解析就变成了对xml文件的处理。

剩下的事就是:

(1)选用合适的python的xml库 (注:PDMHandler采用了xml.dom.minidom)

(2)分析.pdm文件的详细结构

(3)定义PDMHandler工具类的API接口,实现对.pdm的操作、解析

附注:PDM文件结构简析

所有的"包、表定义、表字段定义、索引、索引字段定义等“全都定义在.pdm文件的这个路径下(以类文件系统路径方式表示):

shell/Model/o:RootObject/c:Children/o:Model

比如(包 - o:Package)定义:

注意:包定义是可嵌套的,/c:Packages/o:Package可反复嵌套;另外o:Model本身也可以看作一个包

shell/Model/o:RootObject/c:Children/o:Model/c:Packages/o:Package ...

再如(表 - o:Table)定义:

shell/Model/o:RootObject/c:Children/o:Model/c:Packages/o:Package/c:Tables/o:Table ...

其它PDM元素的位置不再冗述,请见代码PDMHandler.py

以下是Github中此项目的README.md文件,直接贴一份过来供参考 :)

欢迎fork/clone此项目,提出建议

项目主页:https://github.com/petjiang/PDMHandler

源码地址:git@github.com:petjiang/PDMHandler.git

PDMHandler

A tool class to handle sybase PowerDesigner datafile(.pdm).

Currently, it is able to handle PhysicalDiagram in .pdm.

Source Code Intro.

PDMHandler.py

The class implementation of PDMHandler.

use following command to see help docs (sorry that I type it in Chinese):

shell$ echo "import PDMHandler; help(PDMHandler);"|python

TEST PDM files

PowerDesigner model file (.pdm) is prepared in [repodir]/src/testpdm

use these as input argument for testing the example1.py

* NOTICE: (.pdm) files come from PowerDesigner15 directory [Sybase\PowerDesigner 15\Examples]

example1.py

It is a usecase of PDMHandler class, read it as a reference code.

example1.py shows 5 levels of pdm file -- Package/Table/Column/Index/IndexColumn

each level has their own attributes which are defined in PDMHandler class :

pythonPKG_ATTR_LIST=["Name","Code","CreationDate","Creator","ModificationDate","Modifier"]

TBL_ATTR_LIST=["Name","Code","CreationDate","Creator","ModificationDate","Modifier", "PhysicalOptions"]

COL_ATTR_LIST=["Name","Code","CreationDate","Creator","ModificationDate","Modifier", "DataType","Length","Column.Mandatory","Comment"]

IDX_ATTR_LIST=["Name","Code","CreationDate","Creator","ModificationDate","Modifier", "PhysicalOptions","Unique"]

IDXCOL_ATTR_LIST=["CreationDate","Creator","ModificationDate","Modifier"]

By running :

shell$ python example1.py testpdm/Consol.pdm

shows the output to standout :

shellP: Duplicated Database DUPLICATED_DATABASE lpommier

T: Duplicated Account DUPLICATED_ACCOUNT vaudino

T-PATH: /Model/o:RootObject/c:Children/o:Model/c:Tables/o:Table

C: Email EMAIL char(256) 256 1

C: Name NAME char(256) 256

C: URL URL char(256) 256

I: ACCOUNT_PK ACCOUNT_PK 1

IC: EMAIL

T: Duplicated Auteurs DUPLICATED_AUTEURS vaudino

T-PATH: /Model/o:RootObject/c:Children/o:Model/c:Tables/o:Table

C: Email EMAIL char(256) 256 1

C: Title TITLE char(256) 256 1

I: AUTEURS_PK AUTEURS_PK 1

IC: EMAIL

IC: TITLE

I: Publication_FK PUBLICATION_FK

IC: EMAIL

I: Authors_FK AUTHORS_FK

IC: TITLE

T: Duplicated Publication DUPLICATED_PUBLICATION vaudino

T-PATH: /Model/o:RootObject/c:Children/o:Model/c:Tables/o:Table

C: Title TITLE char(256) 256 1

C: Email EMAIL char(256) 256 1

C: Pub_Title PUB_TITLE char(256) 256

C: Summary SUMMARY long varchar

C: Keywords KEYWORDS char(256) 256

I: PUBLICATION_PK PUBLICATION_PK 1

IC: TITLE

I: PUBLISHER_FK PUBLISHER_FK

IC: EMAIL

I: REFERENCES_FK REFERENCES_FK

IC: PUB_TITLE

Why I write it ?

Yes,it is just a tiny code for fun.

But I hope more features will be added in it, and it will be useful to solve some headachy problem. Just like :

compare the online database instance with PDM file.

autogen SQL schema from PDM file (PowerDesigner's auto-gen setting sucks)

autogen ORM fro PDM file (seems awesome?!,support embed c,SQLAlchemy..)

audino python_用 Python 实现 PowerDesigner 数据模型文件的处理相关推荐

  1. csv加header python_用python处理csv格式文件

    用python处理csv格式文件 在各种平台上获取数据时,我们常常获得的是csv格式的文件.csv格式是一种逗号分隔值的文件格式,它并不是非常reader-friendly.所幸,python标准库中 ...

  2. json字段顺序读取 python_如何利用Python批量读取视频文件的时间长度?

    本期的主题是利用Python来实现对视频文件时间长度的读取. 在学习编程语言时,相比较于通过书本来学习知识,我更喜欢通过观看学习视频的方式来进行学习,通过主讲老师的讲解,我能很直观且快速的了解一些知识 ...

  3. Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块...

    Python第五天   文件访问    for循环访问文件    while循环访问文件   字符串的startswith函数和split函数  linecache模块 目录 Pycharm使用技巧( ...

  4. python批量pdf转word,python批量实现Word文件转换为PDF文件

    本文为大家分享了python批量转换Word文件为PDF文件的具体方法,供大家参考,具体内容如下 1.目的 通过万能的Python把一个目录下的所有Word文件转换为PDF文件. 2.遍历目录 作者总 ...

  5. python怎样判断一个文件是否存在_python如何判断一个文件是否存在

    python如何判断一个文件是否存在 发布时间:2020-09-23 11:38:42 来源:亿速云 阅读:82 作者:Leah python如何判断一个文件是否存在?针对这个问题,这篇文章详细介绍了 ...

  6. python怎么发送代码文件_python 通过 socket 发送文件的实例代码

    目录结构: client: #!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = ...

  7. 用Python打造一款文件搜索工具,所有功能自己定义

    前言 在日常的办公中,我们经常会从一堆不同格式的文件(夹)中搜索特定的文件,可能你是凭着记忆去找或是借助软件,但你有想过如何用Python实现吗?本文将基于几个常见的搜索操作讲解. 扫描路径内的内容 ...

  8. 用python打造一款文件搜索工具,所有功能自己定义!

    大家好,又到了python办公自动化系列.在日常的办公中,我们经常会从一堆不同格式的文件(夹)中搜索特定的文件,可能你是凭着记忆去找或是借助软件,但你有想过如何用python实现吗? 扫描路径内的内容 ...

  9. 把python语言翻译出来_Python语言实现翻译小工具(Python打包成exe文件)

    本文主要向大家介绍了Python语言实现翻译小工具(Python打包成exe文件),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 1.环境 windows10 python3.5 ...

最新文章

  1. 生成工具-CodeSmith-享受编程的乐趣(三)(转载)
  2. make things simple
  3. 2014届华为校园招聘机试题
  4. Linux系统删掉多个文件
  5. php在window,php在window上的问题
  6. rx java定时循环_Rxjava定时器异常循环
  7. 小米首场开发者大会:宣布IoT开发者计划,联手百度提升AI能力
  8. php mysql 高亮显示_PHP实现多关键字加亮功能
  9. UniCode 常用字符大全
  10. 什么是句柄?指针和句柄的区别
  11. dcdc芯片效率不高的原因_影响DC-DC转换器效率的主要因素
  12. 国产版谷歌地球到底有多牛?看入行20年“老人”怎么回答
  13. 基于stc89c52的智能温控风扇
  14. 仿QQ音乐(别人的代码)
  15. NVIDIA Jetson Xavier NX 安yolo v5 +D435i摄像头 pyrealsense2 亲测好用
  16. [转]PHP FFI详解 - 一种全新的PHP扩展方式
  17. python爬虫12306查票
  18. core dumped 错误
  19. chrome设置主页打开为百度,免去每次都要输入网址
  20. 人工智能刷题(个人向)

热门文章

  1. spring mvc学习(9):路径参数
  2. 第五十一期:互联网不如国企,去BAT的程序员都是diao丝?
  3. java学习(107):StringBuilder
  4. TI基于MSP430F67641的电能表技术方案
  5. oracle 细粒审核,oracle10g 细粒审计
  6. 「洛谷2495」「BZOJ3052」「SDOI2001」消耗战【虚树+树形动态规划】
  7. Django框架(十二)-- Djang与Ajax
  8. verilog 除法器
  9. socket编程介绍
  10. iOS---------- MBProgressHUD (1.0.0)的变动