feat: 添加代码生成功能
This commit is contained in:
110
utils/generate.py
Normal file
110
utils/generate.py
Normal file
@@ -0,0 +1,110 @@
|
||||
# _*_ coding : UTF-8 _*_
|
||||
# @Time : 2025/03/03 00:03
|
||||
# @UpdateTime : 2025/03/03 00:03
|
||||
# @Author : sonder
|
||||
# @File : generate.py
|
||||
# @Software : PyCharm
|
||||
# @Comment : 本程序
|
||||
from datetime import datetime
|
||||
|
||||
from config.constant import MYSQL_TO_TORTOISE_TYPE
|
||||
|
||||
|
||||
class Generate:
|
||||
"""
|
||||
代码生成成工具
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def convert_mysql_type(cls, mysql_type: str):
|
||||
"""
|
||||
将 MySQL 字段类型转换为 Tortoise-ORM 的字段类型。
|
||||
|
||||
:param mysql_type: MySQL 的字段类型,如 "varchar(255)"、"int(11)" 等
|
||||
:return: Tortoise-ORM 对应的字段类型,如 "CharField"、"IntField" 等
|
||||
"""
|
||||
# 提取字段的基本类型(去掉括号及长度信息)
|
||||
base_type = mysql_type.split("(")[0].lower()
|
||||
|
||||
# 处理特殊情况:tinyint(1) -> BooleanField
|
||||
if base_type == "tinyint":
|
||||
if "(1)" in mysql_type: # tinyint(1) 视为 Boolean
|
||||
return "BooleanField", None
|
||||
return "IntField", None # 其他 tinyint 作为 IntField 处理
|
||||
max_length = None
|
||||
if "(" in mysql_type and base_type in {"char", "varchar"}:
|
||||
max_length = int(mysql_type.split("(")[1].split(")")[0]) # 提取最大长度
|
||||
|
||||
field_type = MYSQL_TO_TORTOISE_TYPE.get(base_type, "TextField")
|
||||
return field_type, max_length
|
||||
|
||||
@classmethod
|
||||
def prepare_template_data(cls, table_info, columns):
|
||||
TYPE_DEFINE = {
|
||||
"int": 0,
|
||||
"str": "",
|
||||
"bool": False,
|
||||
"float": 0.0,
|
||||
"datetime": "",
|
||||
"list": [],
|
||||
"dict": {},
|
||||
"set": set(),
|
||||
"tuple": (),
|
||||
"bytes": b"",
|
||||
"None": 'null',
|
||||
}
|
||||
PYTHON_TO_TS = {
|
||||
"int": "number",
|
||||
"float": "number",
|
||||
"str": "string",
|
||||
"bool": "boolean",
|
||||
"datetime": "string",
|
||||
"Optional[int]": "number | null",
|
||||
"Optional[str]": "string | null",
|
||||
"Optional[bool]": "boolean | null",
|
||||
"Optional[float]": "number | null",
|
||||
"Optional[datetime]": "string | null",
|
||||
"List[int]": "number[]",
|
||||
"List[str]": "string[]",
|
||||
"List[bool]": "boolean[]",
|
||||
"List[datetime]": "string[]",
|
||||
"Dict[str, Any]": "Record<string, any>",
|
||||
"Any": "any",
|
||||
}
|
||||
"""组织数据,供 Jinja2 渲染"""
|
||||
return {
|
||||
"author": table_info.get('author', ""),
|
||||
"prefix": table_info["prefix"],
|
||||
"table_name": table_info["table_name"],
|
||||
"class_name": table_info["class_name"],
|
||||
"table_comment": table_info.get("table_comment", ""),
|
||||
"description": table_info.get("description", ""),
|
||||
"name": table_info.get('class_name', "").lower(),
|
||||
"permission_id": table_info.get('permission_id', ""),
|
||||
"columns": [
|
||||
{
|
||||
"python_name": col["python_name"],
|
||||
"field_type": cls.convert_mysql_type(col["column_type"])[0],
|
||||
"max_length": cls.convert_mysql_type(col["column_type"])[1],
|
||||
"is_nullable": not col["is_required"],
|
||||
"is_unique": col.get("is_unique", False),
|
||||
"default": col.get("default", None),
|
||||
"column_comment": col.get("column_comment", ""),
|
||||
"column_name": col["column_name"],
|
||||
"is_required": col.get("is_required", False),
|
||||
"is_edit": col.get("is_edit", False),
|
||||
"is_list": col.get("is_list", False),
|
||||
"is_query": col.get("is_query", False),
|
||||
"is_insert": col.get("is_insert", False),
|
||||
"is_hide": col.get("is_hide", False),
|
||||
"query_way": col.get("query_way", "="),
|
||||
"show_type": col.get("show_type", "input"),
|
||||
"python_type": col.get("python_type", "str"),
|
||||
"define": TYPE_DEFINE.get(col.get("python_type", "str"), None),
|
||||
"typescript_type": PYTHON_TO_TS.get(col.get("python_type", "str"), "any"),
|
||||
}
|
||||
for col in columns
|
||||
if col["python_name"] and col["column_type"]
|
||||
],
|
||||
"current_time": datetime.now().strftime("%Y/%m/%d %H:%M:%S")
|
||||
}
|
||||
Reference in New Issue
Block a user