from sqlalchemy import MetaData, Table, inspect, text, Column, Integer, String, DateTime, Date
from flask import current_app
from lib.error import Error
from model.ide.ide_table import IdeTable
from model.ide.ide_attr import IdeAttr
from model.ide.ide_section import IdeSection
from core.environment.application import Application
class BuilderTable(Application):
def create(self, module: str, table: str, name: str, parent: int = None, back_data: bool = True) -> int | dict:
"""
@ SqlAlchemy:生成:数据表
:param module: 模块名称
:param table: 表名称
:param name: 表显示名称
:param parent: 父表
:param back_data: 是否返回数据
"""
if inspect(self.engine).has_table(table):
raise Error(f"{table}:{Error.TABLE_ALREADY_EXISTS}")
fields_default = "这里是 yaml 配置"
if parent is None:
fields_default = [field for field in fields_default if field["name"] != "fid"]
fields_format = [self.generate_column(field) for field in fields_default]
Table(table, MetaData(), *fields_format).create(self.engine)
return _table
@classmethod
def generate_column(cls, params: dict):
"""
@ SqlAlchemy:生成:字段对象
:param params: 字段参数
"""
format_data = params
if params.get("type_") is not None:
format_data["type_"] = cls.generate_type(params["type_"])
if params.get("server_default") is not None:
format_data["server_default"] = text(str(params["server_default"]))
return Column(**format_data)
@classmethod
def generate_type(cls, typer: str, length: int = 50):
"""
@ SqlAlchemy:生成:类型对象
:param typer: 类型
:param length: 长度
"""
if typer == "int":
return Integer
elif typer == "str":
return String(length)
elif typer == "date":
return Date
elif typer == "datetime":
return DateTime
else:
return String(length)
配置是 yaml
field:
# 默认字段:新建模块场景
default:
-
name: id
type_: int
comment: 系统编号
primary_key: true
-
name: sid
type_: varchar
comment: 业务编号
index: true
primary_key: false
-
name: fid
type_: int
comment: 父表编号
index: true
primary_key: false
-
name: create_user
type_: int
comment: 创建人
index: true
primary_key: false
-
name: create_group
type_: int
comment: 创建组
index: true
primary_key: false
-
name: update_user
type_: int
comment: 修改人
index: true
primary_key: false
-
name: update_group
type_: int
comment: 修改组
index: true
primary_key: false
-
name: create_time
type_: datetime
comment: 创建时间
primary_key: false
-
name: update_time
type_: datetime
comment: 更新时间
primary_key: false
-
name: status
type_: int
comment: 系统状态
index: true
primary_key: false
server_default: 1
然后代外层循环创建表的时候居然除了第一张表是对的后面全是 varchar
了,人都傻了,这怎么回事
比较容易发现的问题是,跑到了这一段代码
提供的细节比较少,我怀疑是你完整的yaml不正确