def lock(cls, orderno, pid, sid_list): # 事物 session = db.create_scoped_session() # query能直接放对象吗?<sql:query>标签用来运行SQL SELECT语句, # filter用类名.属性名,比较用==,filter_by直接用属性名,比较用= # rows 是链式调用返回的修改数 rows = session.query(PlaySeat).filter( PlaySeat.pid == pid, # Seatstatus 自定义类方法 PlaySeat.status == SeatStatus.ok.value, # sqlalchemy in语法查询,查询id 在一个list里的所有集合 PlaySeat.sid.in_(sid_list) ).update( { 'orderno': orderno, 'status': SeatStatus.locked.value, 'lock_time': datetime.now() # 属于 update 的参数 synchronize_session用于query在进行delete or update操作时,对session的同步策略。 # False - 不对session进行同步,直接进行delete or update操作。 }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows
def buy(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value).update( {'status': SeatStatus.sold.value}, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows
def refund(orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value).update( { 'status': SeatStatus.ok.value, 'orderno': None, }, synchronize_session=False) # 不同步 if rows != len(sid_list): session.rollback() return 0 session.commit() return rows
def buy(cls, orderno, pid, sid_list): """购买座位""" session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value).update( { 'status': SeatStatus.sold.value, }, synchronize_session=False) # 如果更新的行数量与我们传入的座位数量不符,则回滚,并返回0 if rows != len(sid_list): session.rollback() return 0 # 如果数量符合,则提交,并返回锁定的座位数量 session.commit() return rows
def unlock(cls, orderno, pid, sid_list): # 隔离错误 session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value).update({ 'orderno': None, 'status': SeatStatus.ok.value, }) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows
def lock(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter( PlaySeat.pid == pid, PlaySeat.status == SeatStatus.ok.value, PlaySeat.sid.in_(sid_list)).update( { 'orderno': orderno, 'status': SeatStatus.locked.value, 'lock_time': datetime.now() }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows
def print_ticket(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value, ).update({ "status": SeatStatus.printed.value, }, synchronize_session=False) if rows != len(sid_list): session.rollback() return 0 session.commit() return rows
def print_tickets(cls, orderno, pid, sid_list): session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value # 把座位的状态码改了,订单号改为无 ).update({ 'status': SeatStatus.ok.value, 'orderno': None, }, synchronize_session=False) # 如果操作数和 座位数长度不一样就回滚 if rows != len(sid_list): session.rollback() # 返回的是0, return 0 session.commit() return rows
def unlock(cls, orderno, pid, sid_list): # 创建一个db.session对象 session = db.create_scoped_session() # 完成解锁操作 rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.locked.value).update( { "orderno": None, "status": SeatStatus.ok.value, }, synchronize_session=False) # 判断是否进行了解锁 if rows != len(sid_list): session.rollback() return 0 # 进行提交 session.commit() return rows
def print_tickets(cls, orderno, pid, sid_list): """执行取票操作,修改座位状态""" session = db.create_scoped_session() rows = session.query(PlaySeat).filter_by( orderno=orderno, status=SeatStatus.sold.value).update( { # 修改座位状态为正常,并将订单号设为空 'status': SeatStatus.printed.value, # 'orderno': None, }, synchronize_session=False) # 如果更新的行数量与我们传入的座位数量不符,则回滚,并返回0 if rows != len(sid_list): session.rollback() return 0 # 如果数量符合,则提交,并返回锁定的座位数量 session.commit() return rows
def lock(cls, orderno, pid, sid_list): #创建数据库session session = db.create_scoped_session() # 查询出pid,status,sid符合锁定条件的座位 rows = session.query(PlaySeat).filter( PlaySeat.pid == pid, PlaySeat.status == SeatStatus.ok.value, PlaySeat.sid.in_(sid_list) # 然后更新这些座位的信息 ).update( { 'orderno': orderno, 'status': SeatStatus.locked.value, 'locked_time': datetime.now() }, synchronize_session=False) # 如果更新的行数量与我们传入的座位数量不符,则回滚,并返回0 if rows != len(sid_list): session.rollback() return 0 session.commit() return rows
def lock(cls, orderno, pid, sid_list): # 创建session session = db.create_scoped_session() # 直接对PlaySeat进行操作 # 进行锁定操作,修改订单号和状态 rows = session.query(PlaySeat).filter( PlaySeat.pid == pid, PlaySeat.status == SeatStatus.ok.value, PlaySeat.sid.in_(sid_list), # 进行修改 ).update( { "orderno": orderno, "status": SeatStatus.locked.value, "lock_time": datetime.now() # 关闭同步session操作 }, synchronize_session=False) # 如果操作没有成功,执行rollback回滚 if rows != len(sid_list): session.rollback() return 0 session.commit() return rows