session.query(User).filter(User.id==7).delete()
session.commit()
obj = session.query(Model).filter_by(id=1).first()
session.delete(obj)
session.commit()
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가지 옵션이 있다.
파이썬에 생성된 쿼리를 곧바로 평가해서 세션으로부터 제거되어야 할 객체를 결정한다. evaluate는 기본값이고 효율적이지만, 견고하지 않고 복잡한 쿼리는 evaluate될 수 없다. 만약 쿼리를 evaluate할 수 없다면, sqlalchemy.orm.evaluator.UnevaluatableError
를 발생시킨다.
삭제되기 전에 select 쿼리를 수행하고 해당 결과를 사용해서 어떤 객체들이 세션에서 삭제되어야 할지 결정한다. 덜 효율적이지만 유효한 쿼리를 다룰 수 있게 된다.
세션 갱신을 시도하지 않기 때문에 매우 효율적이다. 그러나 삭제한 후에 세션을 사용하려고 하면 부정확한 결과를 얻을 수 있다.
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