Files
material-api/web/commons/models/__init__.py
2024-05-29 10:21:31 +08:00

177 lines
4.3 KiB
Python

from datetime import datetime
import time
from nc_http.tools.helpers import camelize
from sqlalchemy.orm.exc import NoResultFound
from commons.models.atomic import Atomic
class BaseModel:
query = None
_unique_fields = []
_db = None
__table__ = None
@classmethod
def atomic(cls):
return Atomic(db=cls._db)
@classmethod
def get_by_id(cls, id_, session=None):
if session:
query = session.query(cls)
else:
query = cls.query
result = query.filter((getattr(cls, 'id', None) or cls.__table__.primary_key) == id_).one_or_none()
return result
@classmethod
def insert_many(cls, dicts, commit=True, session=None):
session = session or cls._db.session()
session.bulk_insert_mappings(cls, dicts)
if commit:
session.commit()
@classmethod
def insert_one(cls, values, commit=True, session=None, return_obj=False):
session = session or cls._db.session()
if not return_obj:
session.bulk_insert_mappings(cls, [values])
else:
obj = cls()
for key, value in values.items():
setattr(obj, key, value)
session.add(obj)
if commit:
session.commit()
if return_obj:
return obj
return
@classmethod
def update_one(cls, values, commit=True, session=None):
session = session or cls._db.session()
session.bulk_update_mappings(cls, [values])
if commit:
session.commit()
@classmethod
def update_many(cls, dicts, commit=True, session=None):
session = session or cls._db.session()
session.bulk_update_mappings(cls, dicts)
if commit:
session.commit()
def to_dict(self, is_camelized=True):
_ = {}
for column in self.__table__.columns:
key = getattr(column, 'quote', None) or column.name
if is_camelized:
_[camelize(key)] = getattr(self, key, None)
else:
_[key] = getattr(self, key, None)
return _
@classmethod
def select_one(cls, query, fields=None):
try:
result = query.one()
except NoResultFound:
return {}
if not result:
return {}
return dict(zip([i.key for i in fields], result))
@classmethod
def test_one(cls):
result = cls.query.first()
return result.to_dict()
@classmethod
def now(cls):
return int(time.time())
@classmethod
def now_datetime(cls):
return datetime.fromtimestamp(int(time.time()))
@classmethod
def get_all(cls):
objects = cls.query.all()
for obj in objects:
yield obj.to_dict()
def update(self, commit=True, session=None, **kwargs):
for key, value in kwargs.items():
if hasattr(self, key):
setattr(self, key, value)
if commit:
session = session or self._db.session()
session.commit()
return
def delete(self, session=None):
session = session or self._db.session()
session.delete(self)
@classmethod
def get_list(cls, query, paging=None, fields=None):
if fields:
query = query.with_entities(*fields.values())
if paging:
page = query.paginate(paging['page'], paging['limit'])
paging['total'] = page.total
result = page.items
else:
result = query.all()
if fields:
columns = fields.keys()
result = [dict(zip(columns, _)) for _ in result]
else:
result = [_.to_dict() for _ in result]
if paging:
return result, paging
return result
@classmethod
def set_order_by(cls, query, sorting=None):
"""
配置查询结果排序
:param query:
:param sorting:
:return:
"""
if not sorting or not isinstance(sorting, dict):
return query
order_field = sorting.get('order_field')
if not order_field:
return query
order = sorting.get('order')
if order == 'desc':
query = query.order_by(getattr(cls, order_field).desc())
else:
query = query.order_by(getattr(cls, order_field))
return query