当前位置: 首页 > 后端技术 > Python

Python3自动生成MySQL数据字典的markdown文本

时间:2023-03-25 22:29:04 Python

为什么要写这个脚本?手淫一场场的速度可想而知,对人的意志和耐心是怎样的折磨和锻炼。总之是一件很费时费力的工作。关键是工作效率太低了,上网查了一下。看看网上有没有工具可以用,一直没找到比较理想满意的,就自己弄一个吧,一劳永逸,说到做到的那种。。。先说第一个吧脚本思路步骤:输入或修改数据库连接配置信息,输入数据表名步骤二:使用pymysql模块连接数据库,判断数据表是否存在步骤三:获取数据表注释步骤4:存储文件夹和文件处理,删除现有的避免重复写入文件。第五步:先写Markdown的头部信息。第六步:从information_schema查询表结构及相关信息。连接运行环境Python运行环境:Windows+python3.6使用的模块:pymysql,os,time,pyinstaller如果模块没有安装,请使用pipinstatllxxxxxx安装,例如:pipinstallpyinstaller获取数据库连接信息既然方法是做数据字典,那肯定是要先连接数据库的,而要连接数据库,自然要先知道数据库的基本信息:IP地址,用户名,登录密码,数据库名称等。为了方便,我这里写了两种配置MySQL连接的方式:第一种是直接在代码中配置,可以直接在代码中修改连接信息;另一种是手动输入连接信息,无需修改代码,方便快捷,一机多用。具体的完整源码我已经上传到同性交友网站GitHub了,大家可以点击下面的链接查看...修改后代码的完整源码:data_dict_config.py手动输入的完整源码:data_dict_input。py执行效果图执行data_dict_config.py脚本执行data_dict_input.py脚本时,交互效果如下。执行脚本后,会在当前目录下生成一个mysql_dict文件夹,打开文件夹,里面的.md格式文件就是各个表格的markdown文本的表格写法,把里面的文字复制到需要的地方即可支持mardkwon,然后就可以使用和查看了。比如我放在有道云笔记上,生成可执行文件的部分效果如下。为了方便不同人群方便快捷的使用,不需要安装Python环境来执行py脚本文件,我将相关脚本打包成Windows可以直接执行的exe文件,下载后双-点击运行(部分系统可能需要管理员权限才能运行),打包方式很简单,就是使用pyinstaller模块执行快速打包,省时省力,具体用法可以上网查。打包命令为:pyinstaller-F-ifavicon.icodata_dict_input.py执行该命令后,会在当前目录下生成一个dict和其他文件夹及相关文件。打开dict的时候会在下面生成一个同名的exe文件data_dict_input.exe,双击打开这个文件,复制到其他地方就可以使用了。下面我为这两个脚本生成了exe可执行文件。您可以点击下载试用。如果下载不了,请到github仓库下载或者自己修改代码生成可执行文件:data_dict_config.exe手动输入可执行文件:data_dict_input.exe完整代码方便一些人想偷懒就不要直接去交友网站查了。这里也贴出其中一个源码(其实我觉得文章有点短,只是凑凑字数而已,大家看懂就好,看透不解释透)。#!/usr/bin/envpython#-*-coding:utf-8-*-"""自动生成MySQL数据表的数据字典支持多次自动获取数据库连接信息,方便多次使用author:gxcuizydate:2020-04-30"""importpymysqlimportosimporttimeclassDataDict(object):def__init__(self,connect_info):#数据库连接配置self.host_name=connect_info[0]self.user_name=connect_info[1]self.pwd=connect_info[2]self.db_name=connect_info[3]self.folder_name='mysql_dict'defrun(self,table_str):"""脚本执行入口"""try:#创建连接conn=pymysql.connect(self.host_name,self.user_name,self.pwd,self.db_name)#创建游标对象用cursor()cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)exceptException:print('数据库连接失败,请检查连接信息!')exit(1)table_list=table_str.split(',')fortable_nameintable_list:#判断表是否存在tssql="SHOWTABLESLIKE'%s'"%(table_name,)cursor.execute(sql)result_count=cursor.rowcountifresult_count==0:print('%s数据库中的%s表名不存在,无法生成...'%(self.db_name,table_name))continue#表注释获取print('开始生成表%s的数据字典'%(table_name,))sql="showtablestatusWHEREName='%s'"%(table_name,)cursor.execute(sql)result=cursor.fetchone()table_comment=result['Comment']#文件夹和文件处理file_path=self.folder_name+os.sep+table_name+'.md'self.deal_file(file_path)#打开文件,准备写入dict_file=open(file_path,'a',encoding='UTF-8')dict_file.write('####%s%s'%(table_name,table_comment))dict_file.write('\n|字段名|字段类型|默认值|字段注释|')dict_file.write('\n|---|---|---|---|')#表结构查询field_str="COLUMN_NAME,COLUMN_TYPE,COLUMN_DEFAULT,COLUMN_COMMENT"sql="select%sfrominformation_schema.COLUMNS其中table_schema='%s'andtable_name='%s'"%(field_str,self.db_name,table_name)cursor.execute(sql)fields=cursor.fetchall()forfieldinfields:column_name=field['COLUMN_NAME']column_type=field['COLUMN_TYPE']column_default=str(field['COLUMN_DEFAULT'])column_comment=field['COLUMN_COMMENT']info='|'+column_name+'|'+column_type+'|'+column_default+'|'+column_comment+'|'dict_file.write('\n'+info)#关闭连接print('完成表%s的数据字典'%(table_name,))dict_file.close()cursor.close()conn.close()defdeal_file(self,file_name):"""处理存储文件夹和文件"""#不存在则创建文件夹ifnotos.path.exists(self.folder_name):os.mkdir(self.folder_name)#删除现有文件ifos.path.isfile(file_name):os.unlink(file_name)deftest_conn(self,conn_info):"""测试数据库连接"""try:#创建连接pymysql.connect(conn_info[0],conn_info[1],conn_info[2],conn_info[3])returnTrueexceptException:returnFalse#程序执行入口if__name__=='__main__':#数据数据连接信息conn_info=input('请输入mysql数据库连接信息(格式为:主机IP,用户名,登录名password,databasename),逗号分隔,输入顺序不能乱序,例如:192.168.0.1,root,root,test_db:')conn_list=conn_info.split(',')whileconn_info==''orlen(conn_list)!=4:conn_info=input('请正确输入mysql数据库连接信息(格式为:主机IP、用户名、登录密码、数据库名),逗号分隔,输入顺序不能乱序,例如:192.168.0.1,root,root,test_db:')conn_list=conn_info.split(',')#测试数据库连接问题dd_test=DataDict(conn_list)db_conn=dd_test.test_conn(conn_list)whiledb_conn==False:conn_info=input('请正确输入mysql数据库连接信息(格式为:主机IP、用户名、登录密码、数据库名),以逗号和输入顺序不能乱,例如:192.168.0.1,root,root,test_db:')conn_list=conn_info.split(',')iflen(conn_list)!=4:continuedd_test=DataDict(conn_list)db_conn=dd_test.test_conn(conn_list)#输入数据表名table_s=input('请输入数据库表名(例如:t_order),如果需要输入多个表名,请用英文逗号分隔(例如:t_order,t_goods),请输入q结束使用:')dd=DataDict(conn_list)whiletable_s!='q':dd.run(table_s)table_s=input('继续使用,请输入数据库表名(如t_order),如需输入多个表名,请用英文逗号分隔(如t_order、t_goods),请输入q结束使用:')else:print('感谢使用,再见...')time.sleep(1)最后一条老规矩,有什么问题可以留言或者通过各种渠道告诉我。虽然我可能不会修改方法和思路,但是如果大家有其他的想法和想法,欢迎大家留言交流分享。交流……