github.com/jincm/wesharechain@v0.0.0-20210122032815-1537409ce26a/server/block/db/api.py (about) 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 from sqlalchemy import or_, and_ 5 from db import models 6 from db.base import * 7 from util import common_util 8 9 10 def model_query(model, session=None, order=False, read_deleted="no", desc=True, *args, **kwargs): 11 """ 12 :param model: 13 :param session: if present, the session to use 14 """ 15 session = session or get_session() 16 query = session.query(model, *args) 17 18 if read_deleted == "no": 19 query = query.filter_by(deleted=False) 20 21 filter_dict = {} 22 for key, value in kwargs.items(): 23 if isinstance(value, (list, tuple, set, frozenset)): 24 column_attr = getattr(model, key) 25 query = query.filter(column_attr.in_(value)) 26 else: 27 filter_dict[key] = value 28 29 if filter_dict: 30 query = query.filter_by(**filter_dict) 31 if order: 32 if desc: 33 query = query.order_by(model.create_time.desc()) 34 else: 35 query = query.order_by(model.create_time) 36 37 return query 38 39 def model_create(model, values): 40 if not values.get('id'): 41 values['id'] = common_util.create_id() 42 ref = model() 43 ref.update(values) 44 session = get_session() 45 with session.begin(): 46 ref.save(session) 47 return values 48 49 def model_batch_create(model, lists): 50 """ 51 批量创建 52 :param lists: 带批量创建的数组 53 :return: 54 """ 55 session = get_session() 56 with session.begin(): 57 try: 58 for data in lists: 59 if not data.get('id'): 60 data['id'] = common_util.create_id() # str(uuid.uuid4()) 61 ref = model() 62 ref.update(data) 63 session.add(ref) 64 session.commit() 65 except Exception as ex: 66 session.rollback() 67 raise ex 68 69 def model_update(model, id, values): 70 query = model_query(model).filter_by(id=id) 71 result = query.update(values) 72 if not result: 73 return None 74 return result 75 76 def model_get(model, id): 77 query = model_query(model) 78 result = query.filter_by(id=id).first() 79 if not result: 80 return None 81 return result 82 83 def model_list(model, offset=0, limit=1000, **filters): 84 query = model_query(model, order=True, **filters) 85 if offset: 86 query = query.offset(offset) 87 if limit: 88 query = query.limit(limit) 89 return query.all() 90 91 def model_count(model, **filters): 92 query = model_query(model, **filters) 93 return query.count() 94 95 def model_deleted(model, id): 96 session = get_session() 97 with session.begin(): 98 query = model_query(model, session=session, id=id) 99 query.update({ 100 "deleted": True 101 }, 102 synchronize_session=False) 103 104