Skip to content

本章概要

表结构解析引擎的工作原理,从数据库读取表元数据并智能推断字段用途的过程。

表结构解析引擎

generator.py 中的 TableSchemaParser 类是代码生成器的解析层,负责从数据库 information_schema 读取表元数据,输出标准化的配置字典。

核心类:TableSchemaParser

python
from generator import TableSchemaParser

parser = TableSchemaParser("django_example")
config = parser.parse()

构造参数

参数说明
table_name数据库表名,可带前缀(django_example)或不带前缀(example

构造时自动处理:

  • 保存原始表名(用于数据库查询)
  • 去掉 django_ 前缀(前缀由 config/env.py 中的 DATABASE_PREFIX 配置)
  • 初始化排除字段列表(id / create_user / create_time / update_user / update_time / is_delete

解析流程

parse() 方法执行 9 步:

1. 获取表信息(TABLE_COMMENT、ENGINE 等)
2. 获取字段列表(排除系统字段)
3. 获取索引信息
4. 清理表名(去掉 sys_/tb_/django_/auth_/captcha_ 前缀)
5. 构建命名(app_name / module_comment / model_class_name / route_prefix)
6. 构建字段配置列表
7. 判断功能标识(has_sort / has_status / has_unique_code)
8. 获取显示字段(优先 name -> title -> 第一个字符串字段)
9. 组装完整配置字典

智能识别规则

图片字段

字段名包含以下关键词时,is_image 标记为 True

avatar / cover / logo / image / photo / picture / img / icon / thumbnail / banner

效果:

  • 前端表单生成图片上传组件
  • 列表中显示图片预览
  • Service 层自动处理文件保存和 URL 补全
  • 自动设置 filterable=Falsesearchable=False

富文本字段

TextField 类型字段且注释包含以下关键词时,is_rich_text 标记为 True

内容 / 介绍 / 说明 / 描述 / 详情 / 正文

效果:

  • 前端表单生成富文本编辑器

状态字段

字段名包含以下关键词时,识别为状态字段:

status / state / is_active / is_enabled / is_deleted

效果:

  • 自动生成状态切换接口(/status
  • 前端列表生成状态标签(启用/停用)
  • has_status=True

排序字段

字段名包含以下关键词时,识别为排序字段:

sort / order / seq / sequence / priority

效果:

  • 分页查询默认按此字段排序
  • has_sort=True

枚举字段

字段注释包含 数字-文本 格式(如 1-正常 2-停用)时,自动解析为选项列表:

python
# 注释:"案例类型:1-类型1 2-类型2 3-类型3 4-类型4"
# 解析结果:
choices = [(1, '类型1'), (2, '类型2'), (3, '类型3'), (4, '类型4')]
min_value = 1
max_value = 4

效果:

  • 前端表单生成下拉选择框
  • 列表中显示选项文本而非数字
  • 自动设置 filter_type='精确匹配'

查询条件

字段满足以下任一条件时,filterable 标记为 True

  1. 字段名包含关键词:name / title / code / mobile / phone / email / username / type / category / status / dept_id / role_id
  2. 字段有数据库索引
  3. 整数字段且有选项

查询类型判断:

  • 字符串字段(非编码类)-> 模糊查询(LIKE)
  • 编码字段(code/sn/no)-> 精确匹配(=)
  • 整数字段 + 有选项 -> 精确匹配(=)
  • 状态字段 -> 精确匹配(=)

字段类型映射

数据库 -> Django 模型字段

数据库类型Django 字段类型
varchar / charCharField
text / longtextTextField
int / tinyint / smallintIntegerField
bigintIntegerField
datetime / timestampDateTimeField
dateDateField
float / doubleFloatField
decimalDecimalField
booleanBooleanField

Django 类型 -> 中文显示

Django 类型中文
CharField字符串
TextField长文本
IntegerField整数
DateTimeField日期时间
DateField日期
FloatField浮点数
DecimalField小数
BooleanField布尔值

输出配置结构

parse() 返回的配置字典结构:

python
{
    "app_name": "example",              # 模块名(去前缀小写)
    "module_comment": "案例",           # 模块中文名(表注释去掉"表"字)
    "model_name": "example",            # 模型名
    "model_class_name": "Example",      # 模型类名(帕斯卡命名)
    "route_prefix": "example",          # 路由前缀(下划线转斜杠)
    "permission_prefix": "sys:example", # 权限前缀
    "primary_key": "id",                # 主键字段
    "display_field": "name",            # 显示字段
    "display_field_camel": "name",      # 显示字段驼峰
    "table_name": "example",            # 表名(去前缀)
    "table_prefix": ["django_"],        # 表前缀列表
    "remove_prefix": True,              # 是否移除前缀
    "menu_group": "tool",               # 菜单分组
    "parent_menu_id": 322,              # 父级菜单ID
    "menu_sort": 5,                     # 菜单排序
    "has_sort": True,                   # 有排序字段
    "has_status": True,                 # 有状态字段
    "has_unique_code": False,           # 有唯一编码字段
    "has_export": False,                # 有导出功能
    "has_image_field": True,            # 有图片字段
    "has_rich_text_field": False,       # 有富文本字段
    "fields": [                         # 字段配置列表
        {
            "name": "name",
            "comment": "案例名称",
            "purpose": "存储案例名称信息",
            "type": "CharField",
            "type_display": "字符串",
            "max_length": 100,
            "nullable": False,
            "required": True,
            "is_unique": False,
            "db_index": True,
            "default": None,
            "in_form": True,
            "in_list": True,
            "filterable": True,
            "filter_type": "模糊查询",
            "editable": True,
            "searchable": True,
            "is_image": False,
            "is_rich_text": False,
        },
        # ... 更多字段
    ]
}

与 CodeGenerator 的关系

generator.py                    generator_config.py
┌─────────────────────┐        ┌─────────────────────┐
│ TableSchemaParser   │        │ CodeGenerator       │
│                     │        │                     │
│ information_schema  │ config │ Jinja2 模板渲染     │
│ ─────────────────>  │ ────>  │ ─────────────────>  │
│ 解析表结构           │ 字典   │ 生成文件             │
└─────────────────────┘        └─────────────────────┘

generator.py 负责"读",generator_config.py 负责"写",通过配置字典解耦。

总结

表结构解析引擎从数据库读取表和字段的元信息(类型、长度、注释、索引等),智能推断字段用途(图片、富文本、状态、排序、枚举、查询条件等),为代码生成器提供结构化的表描述数据。

小蚂蚁云团队 · 提供技术支持