wuyan717

一个真实的经历...............................................................................................算了,一个连一个项目组都难养的小公司里存在两个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()

 

点击一下, 一百个表已报不到两秒钟就完事了,同时说一下感受,如果一个小公司因为需要组建了一个项目组,因为种种原因项目招了一个完全不会该项目组使用的技术。接着他以种种理由跟老板建议再组建一个新的项目组。那老项目就要准备好跳槽的准备了,

就算老板在组建新项目组的时候怎么和你(老项目组的项目负责人(项目主管))说不会撤掉老项目组,其实这都是为将你稳定在重构的过渡期....

 

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-08-07
  • 2021-05-27
  • 2022-01-29
  • 2021-06-22
  • 2021-09-13
  • 2021-11-06
  • 2021-11-07
猜你喜欢
  • 2020-05-08
  • 2021-07-13
  • 2021-12-02
  • 2022-01-04
  • 2021-12-28
  • 2021-11-27
  • 2021-11-06
相关资源
相似解决方案