Flask下的模型层
# 从flask_sqlclchemy中导出SQLALchemy
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy, BaseQuery
from sqlalchemy import Integer, Column, SmallInteger
# 子类继承父类_SQLAlchemy
from sqlalchemy.util.compat import contextmanager
class SQLAlchemy(_SQLAlchemy):
@contextmanager # 上下文管理器,实现_enter和_exit方法的省略
def auto_commit(self):
try:
yield
self.session.commit()
except Exception as e:# 数据发生错误,则回滚
db.session.rollback()
raise e
# 重写filter_by
class Query(BaseQuery):
def filter_by(self, **kwargs):# **kwargs是字典
if 'status' not in kwargs.keys():
kwargs['status'] = 1
# 原来的filter_by的功能
return super(Query, self).filter_by(**kwargs)
# 实现模型映射到数据库的方法,实例化
# query_class实现对原来的filter的覆盖
db = SQLAlchemy(query_class=BaseQuery)
class Base(db.Model):# 在基类中继承db.model
# 不会去想注册一个叫Base的表
__abstract__ = True
# 记录着模型创建的时间
creat_time = Column('creat_time', Integer)
# 设计一个基类模型,实现小整数,实现软删除,软删除不是真的删除,只是改变一下状态
status = Column(SmallInteger, default=1)
def __init__(self):# 时间戳来记载当前时间
self.creat_time = int(datetime.now().timestamp())
def set_attrs(self, attrs_dict):
for key, value in attrs_dict.item():
# 用hasattr来判断某个对象下面是不是包含某个属性
# hasattr函数第一个参数是传入的参数,第二个是属性
# id号不用更改
if hasattr(self, key) and key !='id':
# setattr实现动态赋值
setattr(self, key, value)
# 时间转化函数
@property
def creat_datetime(self):
if self.creat_time:
return datetime.fromtimestamp(self.creat_time)
else:
return None
# 软删除
def delete(self):
self.status = 0