一个真实的经历...............................................................................................算了,一个连一个项目组都难养的小公司里存在两个python和Java两个项目组,技术总监会什么就决定了哪个项目组的存亡,
即便他是来的比较晚。很不幸,我的这个技术总监对python一无所知。于是有了将python项目重构成Java的过程,
也就有了整理数据库文档的经历。。。。。。。
由于django从model迁移时没有将注释(也就是模型类中的verbose_name)写进mysql的表中,导致从MySQL导出的数据文件中没有注释。这就坑爹了,没有字段注释,那他想将这个python项目重构成Java等于百日做梦,
毕竟数据比代码值钱,如果不是因为里面的数据,直接重写一个项目不就行了,还重构个屁啊。将数据库直接导出来给负责重构的Java人员,他差点崩溃。
结果总监居然想让我将表结构导出来一个个补注释(这个项目是我主导、和负责的),这脑子秀逗了??????
想代码解决吧,查了一下,没有任何可参考的例子(没翻墙的情况下)。没办法,只能自己写了,毕竟模型类就在那里,它是跑不掉的,想办法把它揪出来就行了。话不多说,直接上代码
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、嵌套循环模块下的表和字段,并对字段做处理
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' if field_type == 'Date (with time)': field_type = 'datetime' if field_type == 'Date (without time)': field_type = 'date' if field_type == 'Boolean (Either True or False)': field_type = 'tinyint' if field_type == 'String (up to %(max_length)s)': field_type = 'varchar' if field_type == 'Small integer': field_type = 'smallint' if field_type == 'Floating point number': field_type = 'double' if field_type == 'Foreign Key (type determined by related field)': field_type = 'int' if 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()
点击一下, 一百个表已报不到两秒钟就完事了,同时说一下感受,如果一个小公司因为需要组建了一个项目组,因为种种原因项目招了一个完全不会该项目组使用的技术。接着他以种种理由跟老板建议再组建一个新的项目组。那老项目就要准备好跳槽的准备了,
就算老板在组建新项目组的时候怎么和你(老项目组的项目负责人(项目主管))说不会撤掉老项目组,其实这都是为将你稳定在重构的过渡期....