django 整理数据库文档时,从mysql导出的表中没有注释的解决方案
公司要将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()
点击一下, 一百多个表已报不到两秒钟就完事了,方便,简单,快捷。。。。