我们在做页面的时候, 一般都要和数据相适应,这个时候就需要去修改数据库, 至少需要数据库相关的人员配合, 改来改去的容易产生一些版本遗留问题。

就算是我一个人开发, 一会儿搞前端,一会儿搞后台, 也是感觉麻烦,容易出错。

所以打算搞一个接口生成的工具, 有的时候查询表格就直接代码生成出来, 如果有逻辑,就将逻辑独立出来,然后代码生成的时候融入进去, 这样修改起来也就更简单一些。

这个模块是表格生成部分的示例代码, 项目还在开发, 可能有些地方还是太理想化了, 会出现一些难以解决的问题而将项目终止掉, 但是不努力尝试怎么会知道会不会成功呢, 给自己加油@1711065015。

class gen_table:
		# 记录一些表格基本数据
    ctab = '    '
    str_c = {}
    # 创建一张新表
    def create_table(self, tn):
        return (f'class {tn[0].upper()}{tn[1:]}(db.Model):\n'
        f'{self.ctab} __tablename__ = "{tn}"\n'
        f'{self.ctab}__id_ = db.Column(db.Integer, auto_incread=True, primary_key=True)\n'
        )
		# 表格生成
    def gen(self, se):
        ts = se.split('.')
        for i in range(len(ts)-1): #[:-1]:
            t = ts[i].strip()
            tb = ts[i-1].strip() if i > 0 else None 
            if t[0] == '(' and t[-1] == ')':
                et = t[1:-1].split(',')
                for e in et:
                    if e in self.str_c:continue
                    self.str_c[e] = {
                        'content':self.create_table(e.strip()),
                        'items':[],
                        'bcontent':'',
                        'bitems':[]
                    }
            elif t not in self.str_c:
                # if t in self.str_c:continue
                self.str_c[t] = {
                    'content':self.create_table(t),
                    'items':[],
                    'bcontent':'',
                    'bitems':[]
                }
            if tb is None:continue
            et = tb[1:-1].split(',')    
            if tb[0] == '(' and tb[-1] == ')':
                if et is None: continue 
                for e in et:
                    e = e.strip()
                    if f'__{e}_id_' in self.str_c[t]['items']: continue
                    self.str_c[t]['content'] += f"{self.ctab}__{e}_id_ = db.Column(db.Integer, db.ForeignKey('{e}.id'), nullable=False)\n"
                    self.str_c[t]['items'].append(f'__{e}_id_')
            else:

                if f'__{tb}_id_' in self.str_c[t]['items']: continue
                # print(t)
                self.str_c[t]['content'] += f"{self.ctab}__{tb}_id_ = db.Column(db.Integer, db.ForeignKey('{tb}.id'), nullable=False)\n"
                self.str_c[t]['items'].append(f'__{tb}_id_')
 
        if ts[-2] not in self.str_c: return
        
        if ts[-2] not in self.str_c[ts[-2]]['bitems']:
            self.str_c[ts[-2]]['bcontent'] += f"{self.ctab}_{ts[-1]} = db.Column(db.String)\n"
            self.str_c[ts[-2]]['bitems'].append(ts[-2])
# 测试
bstr = ['x.c','x.b.c','(x,y).b.c']
gt = gen_table()
for b in bstr:
    gt.gen(b)
# 打印
for e in gt.str_c:
    print(gt.str_c[e]['content'],end='')  
    print(gt.str_c[e]['bcontent'])    
# 执行输出

class X(db.Model):
     __tablename__ = "x"
    __id_ = db.Column(db.Integer, auto_incread=True, primary_key=True)
    _c = db.Column(db.String)

class B(db.Model):
     __tablename__ = "b"
    __id_ = db.Column(db.Integer, auto_incread=True, primary_key=True)
    __x_id_ = db.Column(db.Integer, db.ForeignKey('x.id'), nullable=False)
    __y_id_ = db.Column(db.Integer, db.ForeignKey('y.id'), nullable=False)
    _c = db.Column(db.String)

class Y(db.Model):
     __tablename__ = "y"
    __id_ = db.Column(db.Integer, auto_incread=True, primary_key=True)

代码里面还没有添加表格元素类型的定义, 后面再优化, 期待大家评论区讨论和代码完成的时候能够和大家一起测试。

03-22 11:19