Flask-SQLAlchemy简单封装(一)

2,099 阅读2分钟

这是我参与更文挑战的第25天,活动详情查看: 更文挑战

前言

提到Flask, 自然就少不了它在数据库方面至关重要的插件: Flask-SQLAlchemy

在使用Flask-SQLAlchemy时, 相信很多兄弟们都或多或少遇到过坑, 例如:

  1. json与Model的相互转换
  2. 查询条件的使用
  3. 分页查询

笔者之前尝试过用Flask写一些小东西, 可每次都是用的时候乱搞一气, 很难有积累下的东西

浪费了大部分光阴后, 总算记得积累一下, 所以特写此文章

希望可以帮助各位和我一样的初学者, 减少部分开发时间

开始封装

首先, 我们创建一个实体类Entity, 它继承自Model:

class Entity(db.Model):
    __abstract__ = True

这个类不是具体的表, 是抽象的, 所以要设置__abstract__ = True

笔者默认所有数据实体都应拥有主键id属性, 同时利用新特性@dataclass方便初始化:

@dataclass(init=False)
class Entity(db.Model):
    __abstract__ = True

    id: int = db.Column(db.Integer, primary_key=True, autoincrement=True)

需要注意的是, Entity为抽象类, 不需要进行初始化, 所以要配置为: @dataclass(init=False)

增加查询方法

有了属性和主键, 就可以撰写基础的查询/查看方法了, 先说明下概念:

  • 查询: 根据条件查询
  • 查看: 根据主键查看

我们先来写查询:

@classmethod
def search(cls, parameters: dict = None) -> list:
    """
    查询
    :param parameters: 条件
    :return: 数组结果
    """
    return cls.query.filter(**parameters).all()

再来写查看:

@classmethod
def get(cls, key: int):
    """
    查看
    :param key: 主键id
    :return: 结果
    """
    return cls.query.get(key)

是不是很简单?

增加删除方法

先明确概念, 默认删除方法的含义为: 根据主键删除

删除需要用到我们的数据库db(就是SQLAlchemy()):

@classmethod
def delete(cls, key: int):
    """
    删除
    :param key: 主键id
    :return: 无
    """
    db.session.delete(cls.get(key))
    db.session.commit()

写到这里我们会发现, 删除之前调用了查看方法, 如果数据不存在怎么办呢?

所以, 我们稍微调整下get方法, 让它抛出异常:

@classmethod
def get(cls, key: int):
    """
    查看
    :param key: 主键id
    :return: 结果
    """
    result = cls.query.get(key)
    if result is None:
        raise BusinessException('资源不存在')
    return result

这里的BusinessException为笔者自定义的全局异常拦截, 请根据实际情况调整

未完待续...