Skip to content

Update code generator file and table naming #579

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions backend/plugin/code_generator/api/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
from fastapi import APIRouter

from backend.core.conf import settings
from backend.plugin.code_generator.api.v1.business import router as gen_business_router
from backend.plugin.code_generator.api.v1.column import router as gen_model_router
from backend.plugin.code_generator.api.v1.gen import router as gen_router
from backend.plugin.code_generator.api.v1.gen_business import router as gen_business_router
from backend.plugin.code_generator.api.v1.gen_model import router as gen_model_router

v1 = APIRouter(prefix=f'{settings.FASTAPI_API_V1_PATH}/gen', tags=['代码生成'])

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@
from backend.common.security.jwt import DependsJwtAuth
from backend.common.security.permission import RequestPermission
from backend.common.security.rbac import DependsRBAC
from backend.plugin.code_generator.schema.gen_business import (
from backend.plugin.code_generator.schema.business import (
CreateGenBusinessParam,
GetGenBusinessDetail,
UpdateGenBusinessParam,
)
from backend.plugin.code_generator.schema.gen_model import GetGenModelDetail
from backend.plugin.code_generator.service.gen_business_service import gen_business_service
from backend.plugin.code_generator.service.gen_model_service import gen_model_service
from backend.plugin.code_generator.schema.column import GetGenModelDetail
from backend.plugin.code_generator.service.business_service import gen_business_service
from backend.plugin.code_generator.service.column_service import gen_model_service

router = APIRouter()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
from backend.common.security.jwt import DependsJwtAuth
from backend.common.security.permission import RequestPermission
from backend.common.security.rbac import DependsRBAC
from backend.plugin.code_generator.schema.gen_model import CreateGenModelParam, GetGenModelDetail, UpdateGenModelParam
from backend.plugin.code_generator.service.gen_model_service import gen_model_service
from backend.plugin.code_generator.schema.column import CreateGenModelParam, GetGenModelDetail, UpdateGenModelParam
from backend.plugin.code_generator.service.column_service import gen_model_service

router = APIRouter()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from sqlalchemy_crud_plus import CRUDPlus

from backend.plugin.code_generator.model import GenBusiness
from backend.plugin.code_generator.schema.gen_business import CreateGenBusinessParam, UpdateGenBusinessParam
from backend.plugin.code_generator.schema.business import CreateGenBusinessParam, UpdateGenBusinessParam


class CRUDGenBusiness(CRUDPlus[GenBusiness]):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy_crud_plus import CRUDPlus

from backend.plugin.code_generator.model import GenModel
from backend.plugin.code_generator.schema.gen_model import CreateGenModelParam, UpdateGenModelParam
from backend.plugin.code_generator.model import GenColumn
from backend.plugin.code_generator.schema.column import CreateGenModelParam, UpdateGenModelParam


class CRUDGenModel(CRUDPlus[GenModel]):
class CRUDGenModel(CRUDPlus[GenColumn]):
"""代码生成模型 CRUD 类"""

async def get(self, db: AsyncSession, pk: int) -> GenModel | None:
async def get(self, db: AsyncSession, pk: int) -> GenColumn | None:
"""
获取代码生成模型列

Expand All @@ -22,7 +22,7 @@ async def get(self, db: AsyncSession, pk: int) -> GenModel | None:
"""
return await self.select_model(db, pk)

async def get_all_by_business(self, db: AsyncSession, business_id: int) -> Sequence[GenModel]:
async def get_all_by_business(self, db: AsyncSession, business_id: int) -> Sequence[GenColumn]:
"""
获取所有代码生成模型列

Expand Down Expand Up @@ -66,4 +66,4 @@ async def delete(self, db: AsyncSession, pk: int) -> int:
return await self.delete_model(db, pk)


gen_model_dao: CRUDGenModel = CRUDGenModel(GenModel)
gen_model_dao: CRUDGenModel = CRUDGenModel(GenColumn)
4 changes: 2 additions & 2 deletions backend/plugin/code_generator/model/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from backend.plugin.code_generator.model.gen_business import GenBusiness
from backend.plugin.code_generator.model.gen_model import GenModel
from backend.plugin.code_generator.model.business import GenBusiness
from backend.plugin.code_generator.model.column import GenColumn
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@
from backend.common.model import Base, id_key

if TYPE_CHECKING:
from backend.plugin.code_generator.model import GenModel
from backend.plugin.code_generator.model import GenColumn


class GenBusiness(Base):
"""代码生成业务表"""

__tablename__ = 'sys_gen_business'
__tablename__ = 'gen_business'

id: Mapped[id_key] = mapped_column(init=False)
app_name: Mapped[str] = mapped_column(String(50), comment='应用名称(英文)')
Expand All @@ -26,11 +26,12 @@ class GenBusiness(Base):
table_comment: Mapped[str | None] = mapped_column(String(255), default=None, comment='表描述')
# relate_model_fk: Mapped[int | None] = mapped_column(default=None, comment='关联表外键')
schema_name: Mapped[str | None] = mapped_column(String(255), default=None, comment='Schema 名称 (默认为英文表名称)')
filename: Mapped[str | None] = mapped_column(String(20), default=None, comment='基础文件名(默认为英文表名称)')
default_datetime_column: Mapped[bool] = mapped_column(default=True, comment='是否存在默认时间列')
api_version: Mapped[str] = mapped_column(String(20), default='v1', comment='代码生成 api 版本,默认为 v1')
gen_path: Mapped[str | None] = mapped_column(String(255), default=None, comment='代码生成路径(默认为 app 根路径)')
remark: Mapped[str | None] = mapped_column(
LONGTEXT().with_variant(TEXT, 'postgresql'), default=None, comment='备注'
)
# 代码生成业务模型一对多
gen_model: Mapped[list['GenModel']] = relationship(init=False, back_populates='gen_business')
gen_column: Mapped[list['GenColumn']] = relationship(init=False, back_populates='gen_business')
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@
from backend.plugin.code_generator.model import GenBusiness


class GenModel(DataClassBase):
"""代码生成模型表"""
class GenColumn(DataClassBase):
"""代码生成模型列表"""

__tablename__ = 'sys_gen_model'
__tablename__ = 'gen_column'

id: Mapped[id_key] = mapped_column(init=False)
name: Mapped[str] = mapped_column(String(50), comment='列名称')
comment: Mapped[str | None] = mapped_column(String(255), default=None, comment='列描述')
type: Mapped[str] = mapped_column(String(20), default='str', comment='SQLA 模型列类型')
type: Mapped[str] = mapped_column(String(20), default='String', comment='SQLA 模型列类型')
pd_type: Mapped[str] = mapped_column(String(20), default='str', comment='列类型对应的 pydantic 类型')
default: Mapped[str | None] = mapped_column(
LONGTEXT().with_variant(TEXT, 'postgresql'), default=None, comment='列默认值'
Expand All @@ -33,6 +33,6 @@ class GenModel(DataClassBase):

# 代码生成业务模型一对多
gen_business_id: Mapped[int] = mapped_column(
ForeignKey('sys_gen_business.id', ondelete='CASCADE'), default=0, comment='代码生成业务ID'
ForeignKey('gen_business.id', ondelete='CASCADE'), default=0, comment='代码生成业务ID'
)
gen_business: Mapped[Union['GenBusiness', None]] = relationship(init=False, back_populates='gen_model')
gen_business: Mapped[Union['GenBusiness', None]] = relationship(init=False, back_populates='gen_column')
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
# -*- coding: utf-8 -*-
from datetime import datetime

from pydantic import ConfigDict, Field, model_validator
from typing_extensions import Self
from pydantic import ConfigDict, Field

from backend.common.schema import SchemaBase

Expand All @@ -17,18 +16,12 @@ class GenBusinessSchemaBase(SchemaBase):
table_simple_name_zh: str = Field(description='表名称(中文简称)')
table_comment: str | None = Field(None, description='表描述')
schema_name: str | None = Field(None, description='Schema 名称 (默认为英文表名称)')
filename: str | None = Field(None, description='基础文件名(默认为英文表名称)')
default_datetime_column: bool = Field(True, description='是否存在默认时间列')
api_version: str = Field('v1', description='代码生成 api 版本')
gen_path: str | None = Field(None, description='代码生成路径(默认为 app 根路径)')
remark: str | None = Field(None, description='备注')

@model_validator(mode='after')
def check_schema_name(self) -> Self:
"""检查并设置 schema 名称"""
if self.schema_name is None:
self.schema_name = self.table_name_en
return self


class CreateGenBusinessParam(GenBusinessSchemaBase):
"""创建代码生成业务参数"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

from backend.common.exception import errors
from backend.database.db import async_db_session
from backend.plugin.code_generator.crud.crud_gen_business import gen_business_dao
from backend.plugin.code_generator.crud.crud_business import gen_business_dao
from backend.plugin.code_generator.model import GenBusiness
from backend.plugin.code_generator.schema.gen_business import CreateGenBusinessParam, UpdateGenBusinessParam
from backend.plugin.code_generator.schema.business import CreateGenBusinessParam, UpdateGenBusinessParam


class GenBusinessService:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@

from backend.common.exception import errors
from backend.database.db import async_db_session
from backend.plugin.code_generator.crud.crud_gen_model import gen_model_dao
from backend.plugin.code_generator.crud.crud_column import gen_model_dao
from backend.plugin.code_generator.enums import GenModelMySQLColumnType
from backend.plugin.code_generator.model import GenModel
from backend.plugin.code_generator.schema.gen_model import CreateGenModelParam, UpdateGenModelParam
from backend.plugin.code_generator.model import GenColumn
from backend.plugin.code_generator.schema.column import CreateGenModelParam, UpdateGenModelParam
from backend.plugin.code_generator.utils.type_conversion import sql_type_to_pydantic


class GenModelService:
"""代码生成模型服务类"""

@staticmethod
async def get(*, pk: int) -> GenModel:
async def get(*, pk: int) -> GenColumn:
"""
获取指定 ID 的模型

Expand All @@ -36,7 +36,7 @@ async def get_types() -> list[str]:
return types

@staticmethod
async def get_by_business(*, business_id: int) -> Sequence[GenModel]:
async def get_by_business(*, business_id: int) -> Sequence[GenColumn]:
"""
获取指定业务的所有模型

Expand Down
57 changes: 32 additions & 25 deletions backend/plugin/code_generator/service/gen_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import zipfile

from pathlib import Path
from typing import Sequence

import aiofiles

Expand All @@ -13,14 +14,14 @@
from backend.common.exception import errors
from backend.core.path_conf import BASE_PATH
from backend.database.db import async_db_session
from backend.plugin.code_generator.crud.crud_business import gen_business_dao
from backend.plugin.code_generator.crud.crud_column import gen_model_dao
from backend.plugin.code_generator.crud.crud_gen import gen_dao
from backend.plugin.code_generator.crud.crud_gen_business import gen_business_dao
from backend.plugin.code_generator.crud.crud_gen_model import gen_model_dao
from backend.plugin.code_generator.model import GenBusiness
from backend.plugin.code_generator.schema.business import CreateGenBusinessParam
from backend.plugin.code_generator.schema.column import CreateGenModelParam
from backend.plugin.code_generator.schema.gen import ImportParam
from backend.plugin.code_generator.schema.gen_business import CreateGenBusinessParam
from backend.plugin.code_generator.schema.gen_model import CreateGenModelParam
from backend.plugin.code_generator.service.gen_model_service import gen_model_service
from backend.plugin.code_generator.service.column_service import gen_model_service
from backend.plugin.code_generator.utils.gen_template import gen_template
from backend.plugin.code_generator.utils.type_conversion import sql_type_to_pydantic

Expand All @@ -29,7 +30,7 @@ class GenService:
"""代码生成服务类"""

@staticmethod
async def get_tables(*, table_schema: str) -> list[str]:
async def get_tables(*, table_schema: str) -> Sequence[str]:
"""
获取指定 schema 下的所有表名

Expand Down Expand Up @@ -57,32 +58,38 @@ async def import_business_and_model(*, obj: ImportParam) -> None:
raise errors.ForbiddenError(msg='已存在相同数据库表业务')

table_name = table_info[0]
business_data = {
'app_name': obj.app,
'table_name_en': table_name,
'table_name_zh': table_info[1] or ' '.join(table_name.split('_')),
'table_simple_name_zh': table_info[1] or table_name.split('_')[-1],
'table_comment': table_info[1],
}
new_business = GenBusiness(**CreateGenBusinessParam(**business_data).model_dump())
new_business = GenBusiness(
**CreateGenBusinessParam(
app_name=obj.app,
table_name_en=table_name,
table_name_zh=table_info[1] or ' '.join(table_name.split('_')),
table_simple_name_zh=table_info[1] or table_name.split('_')[-1],
table_comment=table_info[1],
schema_name=table_name,
filename=table_name,
).model_dump()
)
db.add(new_business)
await db.flush()

column_info = await gen_dao.get_all_columns(db, obj.table_schema, table_name)
for column in column_info:
column_type = column[-1].split('(')[0].upper()
pd_type = sql_type_to_pydantic(column_type)
model_data = {
'name': column[0],
'comment': column[-2],
'type': column_type,
'sort': column[-3],
'length': column[-1].split('(')[1][:-1] if pd_type == 'str' and '(' in column[-1] else 0,
'is_pk': column[1],
'is_nullable': column[2],
'gen_business_id': new_business.id,
}
await gen_model_dao.create(db, CreateGenModelParam(**model_data), pd_type=pd_type)
await gen_model_dao.create(
db,
CreateGenModelParam(
name=column[0],
comment=column[-2],
type=column_type,
sort=column[-3],
length=column[-1].split('(')[1][:-1] if pd_type == 'str' and '(' in column[-1] else 0,
is_pk=column[1],
is_nullable=column[2],
gen_business_id=new_business.id,
),
pd_type=pd_type,
)

@staticmethod
async def render_tpl_code(*, business: GenBusiness) -> dict[str, str]:
Expand Down
16 changes: 8 additions & 8 deletions backend/plugin/code_generator/utils/gen_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from pydantic.alias_generators import to_pascal, to_snake

from backend.core.conf import settings
from backend.plugin.code_generator.model import GenBusiness, GenModel
from backend.plugin.code_generator.model import GenBusiness, GenColumn
from backend.plugin.code_generator.path_conf import JINJA2_TEMPLATE_DIR


Expand Down Expand Up @@ -56,13 +56,13 @@ def get_code_gen_paths(business: GenBusiness) -> list[str]:
:return:
"""
app_name = business.app_name
module_name = business.table_name_en
filename = business.filename
return [
f'{app_name}/api/{business.api_version}/{module_name}.py',
f'{app_name}/crud/crud_{module_name}.py',
f'{app_name}/model/{module_name}.py',
f'{app_name}/schema/{module_name}.py',
f'{app_name}/service/{module_name}_service.py',
f'{app_name}/api/{business.api_version}/{filename}.py',
f'{app_name}/crud/crud_{filename}.py',
f'{app_name}/model/{filename}.py',
f'{app_name}/schema/{filename}.py',
f'{app_name}/service/{filename}_service.py',
]

def get_code_gen_path(self, tpl_path: str, business: GenBusiness) -> str:
Expand All @@ -78,7 +78,7 @@ def get_code_gen_path(self, tpl_path: str, business: GenBusiness) -> str:
return code_gen_path_mapping[tpl_path]

@staticmethod
def get_vars(business: GenBusiness, models: Sequence[GenModel]) -> dict[str, str | Sequence[GenModel]]:
def get_vars(business: GenBusiness, models: Sequence[GenColumn]) -> dict[str, str | Sequence[GenColumn]]:
"""
获取模板变量

Expand Down
Loading