sqlalchemy delete multiple

x·2021년 3월 26일
1

delete single

session.query(User).filter(User.id==7).delete()
session.commit()

delete single by object

obj = session.query(Model).filter_by(id=1).first()
session.delete(obj)
session.commit()

delete multiple

self.__session.query(Model).filter(
    Model.id.in_([1,2,3])
).delete()

default synchronize_session 값은 'evaluate'인데 복잡한 쿼리면 다음 에러가 발생한다. synchronize_session 옵션에 'fetch'False를 설정해야한다.
Could not evaluate current criteria in Python: "Cannot evaluate clauselist with operator <function comma_op at 0x7fe168d114c0>". Specify 'fetch' or False for the synchronize_session parameter.

self.__session.query(Model).filter(
    Model.id.in_([1,2,3])
).delete(synchronize_session="fetch")
self.__session.commit()

sqlalchemy는 sqlalchemy 메서드를 실행할 때 session을 유지한다. sqlalchemy는 delete 메서드의 synchronize_session 파라미터에 의해 delete()할 때 session에서 제거된 항목을 제거한다. 다음 3가지 옵션이 있다.

synchronize_session=evaluate

파이썬에 생성된 쿼리를 곧바로 평가해서 세션으로부터 제거되어야 할 객체를 결정한다. evaluate는 기본값이고 효율적이지만, 견고하지 않고 복잡한 쿼리는 evaluate될 수 없다. 만약 쿼리를 evaluate할 수 없다면, sqlalchemy.orm.evaluator.UnevaluatableError를 발생시킨다.

synchronize_session=fetch

삭제되기 전에 select 쿼리를 수행하고 해당 결과를 사용해서 어떤 객체들이 세션에서 삭제되어야 할지 결정한다. 덜 효율적이지만 유효한 쿼리를 다룰 수 있게 된다.

synchronize_session=False

세션 갱신을 시도하지 않기 때문에 매우 효율적이다. 그러나 삭제한 후에 세션을 사용하려고 하면 부정확한 결과를 얻을 수 있다.

try except

try:
    session.query(User).filter(User.id==7).delete()
    session.commit()
    return True
except Exception as e:
    self.__session.rollback()
    self.__session.flush()
    self.__logger.error(
        f"msg: {e}"
    )
    return False

참고
참고
참고

0개의 댓글