def process_warn_rules(sakuya_db, chart_id, warns): try: cur = {} for row in sakuya_db.query(WarnRules).filter_by(chart_id=chart_id): cur[row.id] = row for item in warns: id = item.pop('id') if id in cur: row = cur.pop(id) row.content = json.dumps(item) else: row = WarnRules() row.chart_id = chart_id row.content = json.dumps(item) sakuya_db.add(row) for row in cur.values(): sakuya_db.delete(row) sakuya_db.commit() for row in sakuya_db.query(Follows).filter_by(cid=chart_id, recv_warning=True): if row.recv_rules == 'all': continue if not row.recv_rules: continue recv_rules = [] for i in row.get_recv_rules(): if i not in cur.keys(): recv_rules.append(i) row.recv_rules = ','.join(str(i) for i in recv_rules) sakuya_db.commit() except Exception, e: traceback.print_exc() sakuya_db.rollback()