Python 插件 sqlalchemy 循环创建表结果字段类型全部变成一样的奇怪问题?

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 了,人都傻了,这怎么回事

image.png

阅读 665
1 个回答

比较容易发现的问题是,跑到了这一段代码

else:
    return String(length)

提供的细节比较少,我怀疑是你完整的yaml不正确

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题