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

还在手动生成数据库文档?了解

时间:2023-03-26 19:12:13 Python

通过3个简单步骤自动生成数据库文档。了解它。1前言在平时的工作中,大家应该都会遇到导出数据库描述文件(也叫数据字典)的需求,即将各个数据表的字段信息一一整理成表描述,然后使用excel/word/html/md以其他文档格式保存。很多小伙伴还在用原来手工的方式复制粘贴数据库的字段描述(名称、类型、长度、注释等)。不得不说这种方法效率太低了。作为程序员,能通过编程解决的问题就不是问题。下面介绍的方法非常简单,只需要3个步骤。本文将使用python对这三个步骤进行编码,将数据表信息描述输出到excel文档中。因此,主要包括以下内容:生成数据库文档的3步说明获取数据库表元信息获取数据表列的元信息生成数据库描述excel文档(可选)设置excel文档格式2生成数据库描述文档的3步因为数据库会保存相应的元数据信息(即描述数据库、数据表、数据字段本身的信息,如表名、字段表、类型等),所以总的来说,思路生成数据库描述文档很简单,分为步骤3:1)根据数据库名称,从数据库中获取数据表的元信息,主要是表名,表注释等2)根据数据表名,获取数据字段的元信息,主要包括字段名、字段类型、可用空、字段注释等。3)根据元数据信息生成文档Acc按照这个思路,这3个步骤可以通过编码自动生成。各种数据库为了获取元数据信息,会有不同的查询语句。具体可以查询相关官方文档。下面是mysql和oracle的简单列表:#mysql查询表信息和字段信息SELECT*FROMinformation_schema.`TABLES`WHERETABLE_SCHEMA=%db_name%SELECT*FROMinformation_schema.`COLUMNS`WHERETABLE_SCHEMA=%db_name%ANDTABLE_NAME=%table_name%#oracle查询表信息和字段信息SELECT*FROMall_tablesWHEREwhereowner=%db_name%SELECT*FROMall_COL_COMMENTSWHEREowner=%db_name%和TABLE_NAME=%table_name%的实现也可以根据自己喜欢的编程来实现语言。本文以MySQL为例,使用python编程将数据信息输出到excel文档中(具体的excel操作可以参考我之前的文章《 Python 处理 Excel 文件》)。输出效果如下:跟我来实现吧。3获取数据库表元信息3.1Clientpymysql基本上是使用python来进行MySQL的读写操作,使用pymysql,读者可以访问其官方文档了解其安装和使用。简单来说,从数据库中读取数据需要以下步骤:连接数据库:connect获取读取数据的游标:connection.cursor()执行SQL语句获取数据:cursor.execute(sql,args),游标。fetchall(),cursor.fetchone(),cursor.fetchmany()关闭游标和连接:connection.close()获取正在使用的工作表:workbook.active,cursor.close()因此,我们初始化类(__init__)和关闭(__del__),执行数据库连接和关闭操作。代码如下:def__init__(self,host,port,user,password,db_name,charset):#初始化数据库操作self.db=pymysql.connect(host=host,port=port,user=user,password=password,database=db_name,charset=charset)self.cursor=self.db.cursor()def__del__(self):#关闭数据库连接self.db.close()self.cursor.close()3.2获取数据库表元信息根据上面提到的pymysql的基本操作只需要执行SQL查询数据表的元数据信息即可。前面提到,MySQL查询表元信息的SQL语句是SELECT*FROMinformation_schema.TABLESWHERETABLE_SCHEMA=%db_name%,我们只需要表名和表注释即可。所以实现如下:defget_table_info(self,db_name):#获取数据表信息sql='''SELECTtable_schema,table_name,table_commentFROMinformation_schema.`TABLES`WHERETABLE_SCHEMA=%sorderbytable_name'''params=[db_name]#查询数据self.cursor.execute(sql,params)returnself.cursor.fetchall()该函数功能:传入数据库名,返回所有表信息。4获取数据表字段的元信息获取到表信息后,同理需要遍历每个表,根据表名获取每个表的字段信息。上面说到mysql获取表的字段是查询表information_schema.COLUMNS。对于字段信息,我们主要关注字段名称,字段类型,是否允许为空,以及字段的注释说明。代码如下:defget_table_column_info(self,database_name,table_name):#获取数据表列信息params=[database_name,table_name]sql='''SELECTTABLE_SCHEMAAS'库名',TABLE_NAMEAS'表名',COLUMN_NAMEAS'列名',ORDINAL_POSITIONAS'列排序顺序',COLUMN_DEFAULTAS'默认值',IS_NULLABLEAS'是否为空',DATA_TYPEAS'数据类型',CHARACTER_MAXIMUM_LENGTHAS'字符最大长度',NUMERIC_PRECISIONAS'数值精度(最大位数)',NUMERIC_SCALE作为“小数精度”,COLUMN_TYPE作为“列类型”,COLUMN_COMMENT作为来自information_schema的“注释”。`COLUMNS`WHERETABLE_SCHEMA=%sANDTABLE_NAME=%sORDERBYTABLE_NAME,ORDINAL_POSITION'''#查询数据self.cursor.execute(sql,params)returnself.cursor.fetchall()该函数根据数据库名和表名获取该表的字段信息。5生成excel文档5.1将表字段信息输出到excel文档对于excel的操作,我们使用openpyxl进行读写操作。具体的excel操作可以参考我之前的文章《 Python 处理 Excel 文件》。现在我们需要实现的功能是将每个表的字段信息以表格的形式写入到excel表中,并根据字段名、允许为空、字段类型、字段描述输出。还有一点就是我们在设计表的过程中经常会有一些常用的字段,比如id,创建时间,创建人,修改时间,修改人等等,我们在导出字典的时候,可以选择过滤掉。因此,使用如下代码来实现:defcreate_file(self,file_path):#获取文件,如果文件不存在则创建,如果存在则删除并重新创建ifos.path.exists(file_path):os.remove(file_path)wb=Workbook()wb.save(file_path)defsave_column_info_to_excel(self,table_name,table_comment,column_info,file_path,col_names_skip):#将表信息写入excel文件workbook=openpyxl.load_workbook(file_path)#根据下标获取(下标从0开始)sheet=workbook.worksheets[0]row_data=[table_name]iftable_comment:row_data=[table_name+"("+table_comment+")"]sheet.append(row_data)rurrent_max_row=sheet.max_row#空行分隔符sheet.insert_rows(rurrent_max_row)#列名col_name_data=["字段名","允许为空","类型","字段描述"]sheet.append(col_name_data)forrowincolumn_info:#需要过滤ifcol_names_skipandrow[2].lower()incol_names_skip:print("#"*10,"跳过这个字段:",行[2])继续打印(行[2]+","+row[5]+","+row[10]+","+row[11])row_data=[row[2],row[5],row[10],row[11]]sheet.append(row_data)#保存文档workbook.save(file_path)这里包含两个函数。create_file函数主要是创建文件。如果该文档存在,请先将其删除。save_column_info_to_excel函数是根据表字段信息和需要过滤的字段名。使用for语句将行输出到excel。输出过程中,如果有需要过滤的字段,则跳过,最后将文档保存到指定路径。5.2连接各种功能上一节实现了三个功能:数据库表元信息获取、数据表字段元信息获取和字段信息输出到excel文档。现在将这三个函数连接起来,就构成了一个完整的数据库文档导出函数。思路是遍历生成的表元信息(get_table_info),根据表元信息得到表字段信息(gen_table_column_info),然后输出excel文档(save_column_info_to_excel),如下:defgen_db_table_info_skip_col(self,db_name,file_path),col_names_skip):#过滤指定列,导出数据表信息到文档table_info_rows=self.get_table_info(db_name)fortable_rowintable_info_rows:print("\n","*"*10,"生成表信息:",table_row[1])自我??。gen_table_column_info(table_row,file_path,col_names_skip)defgen_table_column_info(self,table_info_row,file_path,col_names_skip=None):#导出字段信息表到文档database_name=table_info_row[0]table_name=table_info_row[1]#table_comment_row_table获取表信息column_info=self.get_table_column_info(database_name,table_name)#写excel文件self.save_column_info_to_excel(table_name,table_comment,column_info,file_path,col_names_skip)这里包含两个函数,gen_db_table_info_skip_col函数是根据数据库名保存需要过滤的字段名导出表元信息,然后使用for语句遍历。gen_table_column_info是根据表信息和需要过滤的字段,先读取表字段信息,然后写入到excel文档中。注意这里的col_names_skip默认值为None,即如果不需要过滤,不输入该参数即可。至此,我们的自动生成数据库文件的功能就完成了。在__main__中执行看输出:if__name__=='__main__':#输出文件地址excel_path="E:/pythontest/test_tableinfo.xlsx"#数据库连接信息host="localhost"port=3306user="root"password="123456"db_name="test"charset='utf8'#需要过滤的字段col_names_to_skip=["id","sys_create_time","sys_create_user","sys_update_time","sys_update_user","record_version"]#初始化类,创建文件,生成数据库描述文件dbInfoGenerator=DbInfoGenerator(host,port,user,password,db_name,charset)dbInfoGenerator.create_file(excel_path)dbInfoGenerator.gen_db_table_info_skip_col(db_name,excel_path,col_names_to_skip)结果如下:table已经输出到excel文档中,对应的字段也进行了筛选。只是格式不是很好看,所以如果有需要可以使用openpyxl来设置excel文档的格式。6(可选)设置excel文档的格式。如果需要格式化excel文档,下面是我的一个基本格式设置。如果您需要,可以参考并制作适合您的文档格式。设置格式的思路主要是:设置每列的宽度,遍历excel表格的每一行。如果是表名,则合并成一行作为表头,表头的格式设置为粗体、黑边、居中对齐、填充背景色。如果表字段信息内容,只需设置黑色边框即可。defset_file_format(self,file_path):#设置表格格式ifnotos.path.exists(file_path):print("文件不存在,不处理")returnworkbook=openpyxl.load_workbook(file_path)sheet=workbook.worksheets[0]#设置每列的宽度sheet.column_dimensions["A"].width=16sheet.column_dimensions["B"].width=10sheet.column_dimensions["C"].width=20sheet.column_dimensions["D"].width=40#设置表名格式max_row=sheet.max_rowforiinrange(1,max_row+1):col1_value=sheet.cell(i,1).valuecol2_value=sheet.cell(i,2).value#如果第一列有数据,第二列没有数据,则为表名ifcol1_valueandnotcol2_value:#合并表名sheet.merge_cells(start_row=i,start_column=1,end_row=i,end_column=4)#粗体font=Font(name="MicrosoftYahei",size=12,bold=True,italic=False,color="000000")#黑边side_style=Side(style="thin",color="000000")border=Border(左=side_style,right=side_风格e,top=side_style,bottom=side_style)#居中对齐cell_alignment=Alignment(horizo??ntal="center",vertical="center",wrap_text=True)#填充背景色p_fill=PatternFill(fill_type="solid",fgColor="BFBFBF")#表名单元格格式forjinrange(1,5):sheet.cell(i,j).font=fontsheet.cell(i,j).border=bordersheet.cell(i,j).alignment=cell_alignmentsheet.cell(i,j).fill=p_fill#如果第一列和第二列有数据,就是表格内容ifcol1_valueandcol2_value:#blackborderside_style=Side(style="thin",color="000000")border=Border(left=side_style,right=side_style,top=side_style,bottom=side_style)#范围内j的表格名称单元格格式(1,5):sheet.cell(i,j).border=border#保存文档workbook.save(file_path)生成数据库描述文档后,调用该函数修改其文档格式,效果如下:7总结本文主要讲解自动生成数据库描述文档(data字典)通过SQL读取数据库表和字段的元信息,然后输出到excel文档,以python的方式完成自动生成文档的功能。如果你还在手动生成数据库文档,可以试试这个方法,肯定会提高你的效率。希望能帮到有需要的人。如果想看完整代码,可以到我的github地址查看:https://github.com/mianshenglee/my-example/tree/master/python/tool-gen-db-doc根据思路实现这篇文章,终于可以给大家留下几个思考题了,想想怎么做:不要用python,用其他你熟悉的语言来实现这个功能。如何只生成指定表的字段信息或过滤指定表?怎么做?数据库表名通常有前缀或后缀。能否根据前缀或后缀生成或过滤?怎么做?本文是生成excel文档,如果需要生成word、html、md、pdf等格式的文档,怎么办?参考资料Openpyxl官方文档:https://openpyxl.readthedocs.io/pymysql官方文档:https://pymysql.readthedocs.io/en/latest/上一篇Python处理Excel文件Python基本操作——文件、目录和路径分布式部署MinIO之使用MinIO轻松搭建静态资源服务获取SpringBoot多数据源(三):参数化变更源获取SpringBoot多数据源(二):动态数据源获取SpringBoot多数据源(一):多套源策略必须-java开发学习知识:DynamicAgent2019看过的好书推荐我的(搜索梅森技术记录)获取更多技术记录: