flask

109 阅读2分钟

创建数据库

www.cnblogs.com/chichung/p/…

sqlalchemy数据类型

blog.csdn.net/Xin_101/art…

migrate修改

blog.csdn.net/gymaisyl/ar…

注意:sqlite不支持删除或更改列

虚拟环境安装包

blog.csdn.net/qq_38558828…

mysql操作

juejin.cn/post/684490…

迁移数据

image.png

过滤后将数据转化为json


def get_static_fileds(class_type):
    return list(
        k for k in class_type.__dict__.keys()
        if not k.startswith("_") and
        not callable(class_type.__dict__.get(k)))

def db_to_json(class_obj):
    fildes = get_static_fileds(type(class_obj))
    spoce = {"class_obj": class_obj}
    return {k: eval(f"class_obj.{k}", spoce) for k in fildes}

func_info = db.session.query(FuncInfo).filter(FuncInfo.time == date).all()
func_info = [db_to_json(item) for item in func_info]

flask 操作数据库工具

# 装饰器
import functools
import json

from flask import request
from flask_cors import cross_origin

error_result = lambda error_info=None: {"state": "faild", "msg": error_info}
success_result = lambda result=None: {"state": "success", "result": result}


def get_static_fileds(class_type):
    return list(
        k for k in class_type.__dict__.keys()
        if not k.startswith("_") and
        not callable(class_type.__dict__.get(k)))


def db_to_json(class_obj):
    fildes = get_static_fileds(type(class_obj))
    spoce = {"class_obj": class_obj}
    return {k: eval(f"class_obj.{k}", spoce) for k in fildes}


def add_db(db, db_type, uni_attr=None, only_attr: str = None):
    """
    添加 数据库记录 装饰器
    :param db_type:
    :param uni_attr: id 自增键
    :param only_attr: 只允许有一个的键
    :return:
    """

    def dec(func):
        @functools.wraps(func)
        def wrap():
            result = func()
            if result:
                return result
            add_dict = {k: v for k, v in request.args.items()}
            fileds = get_static_fileds(db_type)
            for filed in fileds:
                if filed not in add_dict and filed != uni_attr:
                    return error_result(f"缺少参数{filed}")
            if only_attr:
                only_attrs = only_attr.split("|")
                filter_only = list(i for i in only_attrs if i not in fileds)
                if filter_only:
                    return error_result(f"服务器设置错误")
                scope = {"db_type": db_type, "add_dict": add_dict, "db": db}
                args = ','.join(f"db_type.{attr}==add_dict.get('{attr}')"
                                for attr in fileds if attr in only_attrs)
                res = eval(
                    f"db.session.query(db_type).filter({args})", scope).all()

                if len(res) > 0:
                    return error_result(f"该属性不允许重复添加:{only_attr}")
            param_dict = {k: add_dict.get(k) for k in fileds}
            db.session.add(db_type(**param_dict))
            db.session.commit()
            return success_result()

        return wrap

    return dec


def get_db(db, db_type):
    """
    获取 数据库记录 装饰器
    :param db_type:
    :param uni_attr: id 自增键
    :param only_attr: 只允许有一个的键
    :return:
    """

    def dec(func):
        @functools.wraps(func)
        def wrap():
            result = func()
            if result:
                return result
            get_dict = {k: v for k, v in request.args.items()}
            fileds = get_static_fileds(db_type)
            if get_dict:
                scope = {"db_type": db_type, "get_dict": get_dict, "db": db}
                args = ','.join(f"db_type.{attr}==get_dict.get('{attr}')"
                                for attr in fileds if attr in get_dict)
                res = eval(
                    f"db.session.query(db_type).filter({args})", scope).all()
            else:
                res = db.session.query(db_type).all()
            res = [db_to_json(item) for item in res]
            return success_result(res[::-1])

        return wrap

    return dec


def delete_db(db, db_type):
    """
    删除 数据库记录 装饰器
    :param db_type:
    :param uni_attr: id 自增键
    :param only_attr: 只允许有一个的键
    :return:
    """

    def dec(func):
        @functools.wraps(func)
        def wrap():
            result = func()
            if result:
                return result
            fileds = get_static_fileds(db_type)
            get_dict = {k: v for k, v in request.args.items() if k in fileds}
            if get_dict:
                scope = {"db_type": db_type, "get_dict": get_dict, "db": db}
                args = ','.join(f"db_type.{attr}==get_dict.get('{attr}')"
                                for attr in fileds if attr in get_dict)
                eval(
                    f"db.session.query(db_type).filter({args})", scope
                ).delete()
                db.session.commit()
            else:
                return error_result("缺少参数")
            return success_result("删除成功")

        return wrap

    return dec


def modify_db(db, db_type):
    def dec(func):
        @functools.wraps(func)
        def wrap():
            result = func()
            if result:
                return result
            fileds = get_static_fileds(db_type)
            datas = json.loads(request.get_data().decode('utf-8'))
            get_dict = {k: v for k, v in datas.get("old").items() if k in fileds}
            new_dict = {k: v for k, v in datas.get("new").items() if k in fileds}
            if get_dict and new_dict:
                scope = {"db_type": db_type, "get_dict": get_dict, "db": db}
                args = ','.join(f"db_type.{attr}==get_dict.get('{attr}')"
                                for attr in fileds if attr in get_dict)
                res = eval(
                    f"db.session.query(db_type).filter({args})", scope
                ).all()
                for item in res:
                    for key, values in new_dict.items():
                        setattr(item, key, values)
                db.session.commit()
            else:
                return error_result("缺少参数")
            return success_result("修改成功")

        return wrap

    return dec


# 装饰器

# 创建crud方法


def get_empty_func(func_name):
    func_dict = {}
    exec(f"""
def {func_name}():
    pass
    """, func_dict)
    return func_dict.get(func_name)


def create_crud(app, db, db_type, base_name, add_param_dict=None):
    if not add_param_dict:
        add_param_dict = {}

    base_func_name = base_name.replace('/', '_')
    app.route(f"/add/{base_name}")(
        cross_origin()(
            add_db(db, db_type, **add_param_dict)(
                get_empty_func(f"add_{base_func_name}"))))

    app.route(f"/get/{base_name}")(
        cross_origin()(
            get_db(db, db_type)(
                get_empty_func(f"get_{base_func_name}"))))

    app.route(f"/delete/{base_name}")(
        cross_origin()(
            delete_db(db, db_type)(
                get_empty_func(f"delete_{base_func_name}"))))

    app.route(f"/modify/{base_name}", methods=["POST"])(
        cross_origin()(
            modify_db(db, db_type)(
                get_empty_func(f"modify_{base_func_name}"))))