这教程有什么用?
想一下,当你的数据库有几百张表的时候,表结构的管理变得异常的困难,或者公司需要你来维护这些表结构,我们不可能人工去一个个检查是否有更新吧。所以通过脚本导出数据库里所有表的字段极为重要。
准备工作
安装Python3(如何安装的教程已经烂大街,请自行百度)
确保pip正常工作(如果pip不工作,试试python -m ensurepip)
使用pip安装pymysql
使用pip安装python-docx
安装MySQL(推荐使用xampp,自带MySQL了,当然既然都看到这个教程,代表你已经安装了MySQL)
Python编辑器(目前较常用的有Pycharm,sublime,vscode,anaconda里的jupyter notebook等,以及Python自带的IDLE,或者直接命令行启动。萝卜青菜各有所爱,看大家喜欢哪个了)
先看看效果图
做个小小的解释:
蓝色字体的是表的名称,尾随的是字段的数量
表格里就是具体的字段描述了。
开始进入正题
此次我使用但是Python自带的IDLE编辑器(windows10可直接在左下角搜索IDLE)
如下图所示,机器不同可能结果不一样,我这里用的是32位的
点击打开IDLE,默认是交互模式
为了方便记录代码,点击file,new file 并保存文件。我这里保存为export_dictionary.py
撸代码
# 导入所需的库
import pymysql
import os
import docx
# 连接MySQL数据库查询数据,刚安装的#MySQL默认是root,密码为空
conn = pymysql.connect(host='127.0.0.1',
port=3306,
user='root',
passwd='',
db='mysql',
charset='utf8')
# 创建一个游标来操作数据库
cursor = conn.cursor()
# 构造一个查询SQL语句字符串,并执行
sql =
"""select
TABLE_NAME as "表名",
COLUMN_NAME as "字段名",
COLUMN_TYPE as "类型",
COLUMN_COMMENT as "说明" from information_schema.columns where TABLE_SCHEMA='mysql'"""
cursor.execute(sql)
# 执行之后,就可以获取所有的查询记录
rows = cursor.fetchall()
# 接下来我们print rows,得到数据集,每个记录# 是元组
# 可以看得出来,每个元组已经包含了表名,字
# 段名,类型和说明了,接下来我们把这些数据
# 构造成一个dict,它的结构如下
data_dict = {
"表名":[字段字典,字段字典],
"表名2":[字段字典,字段字典],
}
# 构造字典,是为了方便结构化数据,并导出到
# doc文档中。以下是构造一个字典,遍历记集
# 一开始先拿到row[0],这是表名,我们先用get的方法查询data_dict是否已经有表名了,如果没有就update一个表名字典,然后它的指设为空列表,用来装字段字典,columns就是具体的字段字典,生成后就append到该表名的字典里
data_dict = dict()
for row in rows:
name = row[0]
if data_dict.get(name) is None:
data_dict.update()
field = row[1]
dtype = row[2]
description = row[3]
columns = dict(表名=name,字段=field,类型=dtype,描述=description)
data_dict[name].append(columns)
# 按F5运行之后,会得到以下结果,可以看出是# 一个字典(啰嗦了,本来就是来构造字典的)
# 接下来我们可以把这些数据写入到doc文件中
# 了,直接上代码,table.save("tables.docx"),
# 默认是脚本运行的路径,保存之后会看到。
doc = docx.Document()
for key,values in data_dict.items():
doc.add_heading(key+f"()")
table = doc.add_table(rows=1,cols=4,style='Table Grid')
header = table.rows[0]
header.cells[0].text = "序号"
header.cells[1].text = "字段名"
header.cells[2].text = "类型"
header.cells[3].text = "描述"
for index,item in enumerate(values,1):
row = table.add_row()
row.cells[0].text = str(index)
row.cells[1].text = item.get("字段")
row.cells[2].text = item.get("类型")
row.cells[3].text = item.get("描述")
doc.save('tables.docx')
最后的结果如下
最后附上完整代码
领取专属 10元无门槛券
私享最新 技术干货