django 整理数据库文档时,从mysql导出的表中没有注释的解决方案

时间:2021-01-10 03:34:00

公司要将Django项目重构成Java项目,也就有了整理数据库文档的经历。。。。。。。

由于django从model迁移时没有将注释(也就是模型类中的verbose_name)写进mysql的表中,导致从MySQL导出的数据文件中没有注释。

想代码解决吧,查了一下,没有可参考的例子(没*的情况下)。没办法,只能自己写了,毕竟模型类就在那里,它是跑不掉的,想办法把它揪出来就行了。话不多说,直接上代码

1、引入用到的工具包,反正csv可以直接转成Excel,而且python用它写入比用其它Excel依赖包要快

from django.apps import apps
import csv

2、需要导出的模块

apps_list = ['模块1', '模块2', '模块3', ...]  # 我只需要导出部分模块的表,django本身有不少表,项目基本没用它的表,而且项目引用了很多第三方依赖,不少依赖都产生了工具表,那些就也没必要
#如果需要导出全部的模块
#apps_list = [item for item in apps.all_models.keys()] # 这里可以得到所有的模块名称

3、嵌套循环模块下的表和字段,并对字段做处理

model_list = apps.get_models()  # 得到所有模型类名
f = open('数据表导出文件.csv', 'w', encoding='utf-8', newline='')
csv_writer = csv.writer(f)
for model in model_list:
for app in apps_list:
try:
db_model = apps.get_model(app, model._meta.object_name)
except Exception:
continue
table_name = db_model._meta.db_table # 表名
table_zh_name = db_model._meta.verbose_name # 获取表的中文名
csv_writer.writerow(['', table_name, table_zh_name])
csv_writer.writerow(["序号", "字段", "说明", '数据类型', '长度', '允许空', '关联表'])
fields = db_model._meta.fields
i = 0
for item in fields:
i += 1
name = item.name
max_length = item.max_length
null = '√' if item.null else '×'
relation_table_name = ''
field_type = item.description._proxy____args[0]
if field_type == 'Integer':
field_type = 'int'
elif field_type == 'Date (with time)':
field_type = 'datetime'
elif field_type == 'Date (without time)':
field_type = 'date'
elif field_type == 'Boolean (Either True or False)':
field_type = 'tinyint'
elif field_type == 'String (up to %(max_length)s)':
field_type = 'varchar'
elif field_type == 'Small integer':
field_type = 'smallint'
elif field_type == 'Floating point number':
field_type = 'double'
elif field_type == 'Foreign Key (type determined by related field)':
field_type = 'int'
elif field_type == 'Email address':
field_type = 'varchar'
if item.is_relation:
name = str(name) + '_id'
relation_table_name = item.related_model._meta.db_table
csv_writer.writerow([i, name, item.verbose_name, field_type, max_length, null, relation_table_name])
f.close()

点击一下, 一百多个表已报不到两秒钟就完事了,方便,简单,快捷。。。。