def transactional_session(function):
'''
decorator that set the session variable to use inside a function.
With that decorator it's possible to use the session variable like if a global variable session is declared.
session is a sqlalchemy session, and you can get one calling get_session().
'''
@wraps(function)
def new_funct(*args, **kwargs):
if not kwargs.get('session'):
session = get_session()
try:
kwargs['session'] = session
result = function(*args, **kwargs)
session.commit() # pylint: disable=maybe-no-member
except TimeoutError, error:
print error
session.rollback() # pylint: disable=maybe-no-member
raise DatabaseException(str(error))
except DatabaseError, error:
print error
session.rollback() # pylint: disable=maybe-no-member
raise DatabaseException(str(error))
except:
session.rollback() # pylint: disable=maybe-no-member
raise
finally:
session.remove() # pylint: disable=maybe-no-member
else:
result = function(*args, **kwargs)
return result
new_funct.__doc__ = function.__doc__
return new_funct
评论列表
文章目录