这是我参与更文挑战的第25天,活动详情查看: 更文挑战
前言
提到Flask, 自然就少不了它在数据库方面至关重要的插件: Flask-SQLAlchemy
在使用Flask-SQLAlchemy时, 相信很多兄弟们都或多或少遇到过坑, 例如:
- json与Model的相互转换
- 查询条件的使用
- 分页查询
笔者之前尝试过用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为笔者自定义的全局异常拦截, 请根据实际情况调整