# Buggy code
def lookup_movie(session=None, only_cached=None, **lookup_params):
    movie = get_cached("movie", session=session, **lookup_params)
    title = lookup_params.get("title") or ""
    found = None
    if not movie and title:
        found = (
            session.query(TraktMovieSearchResult)
            .filter(TraktMovieSearchResult.search == title.lower())
            .first()
        )
        if found and found.movie:
            log.debug(
                "Found %s in previous search results as %s", title, found.movie.title
            )
            movie = found.movie
    if only_cached:
        if movie:
            return movie
        raise LookupError("Movie %s not found from cache" % lookup_params)
    if movie and not movie.expired:
        return movie
    try:
        trakt_movie = get_trakt("movie", **lookup_params)
    except LookupError as e:
        if movie:
            log.debug("Error refreshing movie data from trakt, using cached. %s", e)
            return movie
        raise
    movie = (
        session.query(TraktMovie)
        .filter(TraktMovie.id == trakt_movie["ids"]["trakt"])
        .first()
    )
    if movie:
        movie.update(trakt_movie, session)
    else:
        movie = TraktMovie(trakt_movie, session)
        session.add(movie)
    if movie and title.lower() == movie.title.lower():
        return movie
    if movie and title and not found:
        if (
            not session.query(TraktMovieSearchResult)
            .filter(TraktMovieSearchResult.search == title.lower())
            .first()
        ):
            log.debug("Adding search result to db")
            session.add(TraktMovieSearchResult(search=title, movie=movie))
    elif movie and found:
        log.debug("Updating search result in db")
        found.movie = movie
    return movie


# Traceback (StaleDataError)
2016-05-18 09:50 DEBUG    api_trakt                     movie `X-Men: Apocalypse` age 0 expires in 2 days
2016-05-18 09:50 DEBUG    api_trakt                     Searching with params: tmdb=246655
2016-05-18 09:50 DEBUG    utils.requests                 Fetching https://api-v2launch.trakt.tv/search
2016-05-18 09:50 DEBUG    utils.requests                 Fetching https://api-v2launch.trakt.tv/movies/149999
--------------------------------------------------------------------------------
ERROR in app [c:\python27\lib\site-packages\flask\app.py:1423]:
Exception on /trakt/movies/X-Men: Apocalypse/ [GET]
--------------------------------------------------------------------------------
Traceback (most recent call last):
File "c:\python27\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "c:\python27\lib\site-packages\flask\app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "c:\python27\lib\site-packages\flask_restful\__init__.py", line 477, in wrapper
resp = resource(*args, **kwargs)
File "c:\python27\lib\site-packages\flask\views.py", line 84, in view
return self.dispatch_request(*args, **kwargs)
File "c:\python27\lib\site-packages\flask_restplus\resource.py", line 42, in dispatch_request
resp = meth(*args, **kwargs)
File "c:\python27\lib\site-packages\flexget\utils\database.py", line 34, in wrapper
return func(*args, **kwargs)
File "c:\python27\lib\site-packages\flexget\utils\sqlalchemy_utils.py", line 141, in __exit__
self.commit()
File "c:\python27\lib\site-packages\sqlalchemy\orm\session.py", line 801, in commit
self.transaction.commit()
File "c:\python27\lib\site-packages\sqlalchemy\orm\session.py", line 392, in commit
self._prepare_impl()
File "c:\python27\lib\site-packages\sqlalchemy\orm\session.py", line 372, in _prepare_impl
self.session.flush()
File "c:\python27\lib\site-packages\sqlalchemy\orm\session.py", line 2019, in flush
self._flush(objects)
File "c:\python27\lib\site-packages\sqlalchemy\orm\session.py", line 2137, in _flush
transaction.rollback(_capture_exception=True)
File "c:\python27\lib\site-packages\sqlalchemy\util\langhelpers.py", line 60, in __exit__
compat.reraise(exc_type, exc_value, exc_tb)
File "c:\python27\lib\site-packages\sqlalchemy\orm\session.py", line 2101, in _flush
flush_context.execute()
File "c:\python27\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 373, in execute
rec.execute(self)
File "c:\python27\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 487, in execute
self.dependency_processor.process_saves(uow, states)
File "c:\python27\lib\site-packages\sqlalchemy\orm\dependency.py", line 1092, in process_saves
secondary_update, secondary_delete)
File "c:\python27\lib\site-packages\sqlalchemy\orm\dependency.py", line 1113, in _run_crud
result.rowcount)
StaleDataError: DELETE statement on table 'trakt_image_movie' expected to delete 1 row(s); Only 2 were matched.

# Fixed code
def lookup_movie(session=None, only_cached=None, **lookup_params):
    movie = get_cached("movie", session=session, **lookup_params)
    title = lookup_params.get("title") or ""
    found = None
    if not movie and title:
        found = (
            session.query(TraktMovieSearchResult)
            .filter(TraktMovieSearchResult.search == title.lower())
            .first()
        )
        if found and found.movie:
            log.debug(
                "Found %s in previous search results as %s", title, found.movie.title
            )
            movie = found.movie
    if only_cached:
        if movie:
            return movie
        raise LookupError("Movie %s not found from cache" % lookup_params)
    if movie and not movie.expired:
        return movie
    try:
        trakt_movie = get_trakt("movie", **lookup_params)
    except LookupError as e:
        if movie:
            log.debug("Error refreshing movie data from trakt, using cached. %s", e)
            return movie
        raise
    movie = session.merge(TraktMovie(trakt_movie, session))
    if movie and title.lower() == movie.title.lower():
        return movie
    if movie and title and not found:
        if (
            not session.query(TraktMovieSearchResult)
            .filter(TraktMovieSearchResult.search == title.lower())
            .first()
        ):
            log.debug("Adding search result to db")
            session.merge(TraktMovieSearchResult(search=title, movie=movie))
    elif movie and found:
        log.debug("Updating search result in db")
        found.movie = movie
    return movie