前言:
目前看官们对“mysql数据库导出er图”都比较重视,咱们都想要分析一些“mysql数据库导出er图”的相关内容。那么小编同时在网摘上搜集了一些对于“mysql数据库导出er图””的相关内容,希望同学们能喜欢,你们一起来了解一下吧!还在苦恼于在word中写表结构吗今天,它来了一键生成,再无忧虑先上效果图
代码目录
python代码connectionDB.py
import pymysqlclass SQLgo(object): def __init__(self, ip=None, user=None, password=None, db=None, port=None): self.ip = ip self.user = user self.password = password self.db = db self.port = int(port) self.con = object @staticmethod def addDic(theIndex, word, value): theIndex.setdefault(word, []).append(value) def __enter__(self): self.con = pymysql.connect( host=self.ip, user=self.user, passwd=self.password, db=self.db, charset='utf8mb4', port=self.port ) return self def __exit__(self, exc_type, exc_val, exc_tb): self.con.close() def search(self, sql=None): data_dict = [] id = 0 with self.con.cursor(cursor=pymysql.cursors.DictCursor) as cursor: sqllist = sql cursor.execute(sqllist) result = cursor.fetchall() for field in cursor.description: if id == 0: data_dict.append({'title': field[0], "key": field[0], "fixed": "left", "width": 150}) id += 1 else: data_dict.append({'title': field[0], "key": field[0], "width": 200}) len = cursor.rowcount return {'data': result, 'title': data_dict, 'len': len} def showtable(self, table_name): with self.con.cursor() as cursor: sqllist = ''' select aa.COLUMN_NAME, aa.DATA_TYPE,aa.COLUMN_COMMENT, cc.TABLE_COMMENT from information_schema.`COLUMNS` aa LEFT JOIN (select DISTINCT bb.TABLE_SCHEMA,bb.TABLE_NAME,bb.TABLE_COMMENT from information_schema.`TABLES` bb ) cc ON (aa.TABLE_SCHEMA=cc.TABLE_SCHEMA and aa.TABLE_NAME = cc.TABLE_NAME ) where aa.TABLE_SCHEMA = '%s' and aa.TABLE_NAME = '%s'; ''' % (self.db, table_name) cursor.execute(sqllist) result = cursor.fetchall() td = [ { 'Field': i[0], 'Type': i[1], 'Extra': i[2], 'TableComment': i[3] } for i in result ] return td def gen_alter(self, table_name): with self.con.cursor() as cursor: sqllist = 'desc %s.%s;' % (self.db, table_name) cursor.execute(sqllist) result = cursor.fetchall() td = [ { 'Field': i[0], 'Type': i[1], 'Null': i[2], 'Key': i[3], 'Default': i[4] } for i in result ] sqllist = 'show table status where NAME="%s";' % (table_name) cursor.execute(sqllist) result = cursor.fetchall() tablecomment = result[0][-1] [item.update(TableComment=tablecomment) for item in td] sqllist = 'show full columns from %s;' % (table_name) cursor.execute(sqllist) result = cursor.fetchall() for item in td: for item1 in result: if item['Field'] == item1[0]: item['Extra'] = item1[-1] break return td def index(self, table_name): with self.con.cursor() as cursor: cursor.execute('show keys from %s' % table_name) result = cursor.fetchall() di = [ { 'Non_unique': '是', 'key_name': i[2], 'column_name': i[4], 'index_type': i[10] } if i[1] == 0 else { 'Non_unique': '否', 'key_name': i[2], 'column_name': i[4], 'index_type': i[10] } for i in result ] dic = {} c = [] for i in di: self.addDic(dic, i['key_name'], i['column_name']) for t in dic: """ 初始化第一个value 将value 数据变为字符串 转为字典对象数组 """ str1 = dic[t][0] for i in range(1, len(dic[t])): str1 = str1 + ',' + dic[t][i] temp = {} for g in di: if t == g['key_name']: temp.setdefault('Non_unique', g['Non_unique']) temp.setdefault('index_type', g['index_type']) temp.setdefault('column_name', str1) temp.setdefault('key_name', t) c.append(temp) return c def baseItems(self, sql=None): with self.con.cursor() as cursor: cursor.execute(sql) result = cursor.fetchall() data = [c for i in result for c in i] return data def query_info(self, sql=None): with self.con.cursor(cursor=pymysql.cursors.DictCursor) as cursor: cursor.execute(sql) result = cursor.fetchall() return resultgenerateWord.py
#!/usr/bin/env python3# coding=utf-8from docx import Documentfrom docx.oxml.ns import qnfrom docx.shared import Ptimport timeimport connectionDBdef generateDB2Word(ip, user, password, port='3306', db='', tgtPath="/"): start = time.time() targetDoc = Document() targetDoc.styles['Normal'].font.name = u'宋体' targetDoc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体') targetHead = ['序号', "字段名称", '数据类型', '长度', '主/外键', '可空', '字段说明', '默认值'] with connectionDB.SQLgo( ip=ip, user=user, password=password, port=port, db=db ) as f: tables = f.baseItems(sql='show tables') for table in tables: # 设置标题 级别5 tbt = targetDoc.add_heading(level=5) tbtRun = tbt.add_run(table) tbtRun.font.size = Pt(12) tbtRun.font.name = 'Times New Roman' tbtRun.font.bold = True # 新增表格 targetTable = targetDoc.add_table(rows=1, cols=len(targetHead)) targetTable.autofit = True targetTable.style = 'Table Grid' targetTable.style.font.size = Pt(10) targetTable.style.font.name = '宋体' # 设置表头 titleCells = targetTable.rows[0].cells for i in range(len(targetHead)): titleCells[i].text = targetHead[i] runCell = titleCells[i].paragraphs[0].runs[0] runCell.font.bold = True # 填充内容 fields = f.gen_alter(table_name=table) for num in range(0, len(fields)): newCells = targetTable.add_row().cells newCells[0].text = str(num + 1) newCells[1].text = fields[num]['Field'] if '(' in fields[num]['Type']: typeLenArray = fields[num]['Type'][0: -1].split('(') newCells[2].text = typeLenArray[0] newCells[3].text = typeLenArray[1] else: newCells[2].text = fields[num]['Type'] if fields[num]['Key'] == 'PRI': newCells[4].text = 'PK' if fields[num]['Null'] == 'YES': newCells[5].text = 'Y' else: newCells[5].text = 'N' newCells[6].text = str(fields[num]['Extra']).replace('None', '') newCells[7].text = str(fields[num]['Default']).replace('None', '') targetDoc.save(tgtPath) end = time.time() print('运行完成, 耗时: ' + str(int(end - start)) + 's')main.py
from generateWord import generateDB2Wordif __name__ == '__main__': generateDB2Word(ip='127.0.0.1', user="root", password="123456", port="3306", db="test", tgtPath='E:\\test.docx')解析主要配置在main.py中db是需要导出的数据库tgtPath是需要导出到哪个路径
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #mysql数据库导出er图