def _escape(value): if value is None: return None return str(value).replace("'", "''") async def model_management_move_down(ns={}): """ 下移:与排序上的下一条记录交换 sort_order(已在最后则提示) 必填参数: id (int|str) 模型主键 """ model_id = ns.get('id') if not model_id: return {'status': False, 'msg': 'id is required'} db = DBPools() async with db.sqlorContext('kboss') as sor: try: current_sql = """ SELECT id, sort_order FROM model_management WHERE id = '%s' LIMIT 1; """ % _escape(model_id) current = await sor.sqlExe(current_sql, {}) if not current: return {'status': False, 'msg': 'model not found'} cur = current[0] cur_order = int(cur.get('sort_order') or 0) cur_id = int(cur.get('id')) next_sql = """ SELECT id, sort_order FROM model_management WHERE (sort_order > %s) OR (sort_order = %s AND id > %s) ORDER BY sort_order ASC, id ASC LIMIT 1; """ % (cur_order, cur_order, cur_id) next_row = await sor.sqlExe(next_sql, {}) if not next_row: return {'status': True, 'msg': 'already at bottom', 'data': {'sort_order': cur_order}} nxt = next_row[0] nxt_order = int(nxt.get('sort_order') or 0) nxt_id = _escape(nxt.get('id')) swap_cur_sql = """ UPDATE model_management SET sort_order = %s WHERE id = '%s'; """ % (nxt_order, _escape(model_id)) swap_nxt_sql = """ UPDATE model_management SET sort_order = %s WHERE id = '%s'; """ % (cur_order, nxt_id) await sor.sqlExe(swap_cur_sql, {}) await sor.sqlExe(swap_nxt_sql, {}) return { 'status': True, 'msg': 'move down success', 'data': { 'id': model_id, 'sort_order': nxt_order, 'swapped_with_id': nxt.get('id'), }, } except Exception as e: await sor.rollback() return {'status': False, 'msg': 'move down failed, %s' % str(e)} ret = await model_management_move_down(params_kw) return ret