model.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from public import db
  2. def db_session_commit():
  3. try:
  4. db.session.commit()
  5. except Exception:
  6. db.session.rollback()
  7. raise
  8. class ModelMixin(object):
  9. __slots__ = ()
  10. def __init__(self, **kwargs):
  11. pass
  12. def save(self):
  13. db.session.add(self)
  14. db_session_commit()
  15. return self
  16. def delete(self, commit=True):
  17. db.session.delete(self)
  18. if commit:
  19. db_session_commit()
  20. def add(self):
  21. db.session.add(self)
  22. def update(self, **kwargs):
  23. required_commit = False
  24. for k, v in kwargs.items():
  25. if hasattr(self, k) and getattr(self, k) != v:
  26. required_commit = True
  27. setattr(self, k, v)
  28. if required_commit:
  29. db_session_commit()
  30. return required_commit
  31. @classmethod
  32. def upsert(cls, where, **kwargs):
  33. record = cls.query.filter_by(**where).first()
  34. if record:
  35. record.update(**kwargs)
  36. else:
  37. record = cls(**kwargs).save()
  38. return record
  39. def to_json(self, excludes=None, selects=None):
  40. if not hasattr(self, '__table__'):
  41. raise AssertionError('<%r> does not have attribute for __table__' % self)
  42. elif selects:
  43. return {i: getattr(self, i) for i in selects}
  44. elif excludes:
  45. return {i.name: getattr(self, i.name) for i in self.__table__.columns if i.name not in excludes}
  46. else:
  47. return {i.name: getattr(self, i.name) for i in self.__table__.columns}