프로그래밍 언어/Python

SQLAlchemy : flush ()와 commit ()의 차이점

Rateye 2021. 9. 7. 10:47
728x90
반응형

 

질문 : SQLAlchemy : flush ()와 commit ()의 차이점은 무엇입니까?

SQLAlchemy에서 flush()commit() 의 차이점은 무엇입니까?

나는 문서를 읽었지만 현명한 사람은 아닙니다. 그들은 내가 가지고 있지 않은 사전 이해를 가정하는 것 같습니다.

특히 메모리 사용에 미치는 영향에 관심이 있습니다. 일련의 파일 (총 약 5 백만 행)에서 일부 데이터를 데이터베이스로로드하는 중이며 세션이 때때로 실패합니다. 이것은 대용량 데이터베이스이고 메모리가 많지 않은 시스템입니다.

commit() 하고 있고 충분한 flush() 호출을 사용하고 있는지 궁금합니다. 그러나 차이점이 무엇인지 실제로 이해하지 않으면 말하기가 어렵습니다!

답변

세션 객체는 기본적으로 데이터베이스 변경 (업데이트, 삽입, 삭제)의 지속적인 트랜잭션입니다. 이러한 작업은 커밋 될 때까지 데이터베이스에 유지되지 않습니다 (프로그램이 세션 중간 트랜잭션에서 어떤 이유로 중단되면 커밋되지 않은 변경 내용이 손실됩니다).

session.add() 트랜잭션 작업을 등록 session.flush() 가 호출 될 때까지 아직 데이터베이스에 전달하지 않습니다.

session.flush() 는 일련의 작업을 데이터베이스에 전달합니다 (삽입, 업데이트, 삭제). 데이터베이스는이를 트랜잭션에서 보류중인 작업으로 유지합니다. 변경 사항은 데이터베이스가 현재 트랜잭션에 대한 COMMIT를 수신 할 때까지 디스크에 영구적으로 유지되거나 다른 트랜잭션에 표시되지 않습니다 (이는 session.commit() 이 수행하는 작업).

session.commit() 은 이러한 변경 사항을 데이터베이스에 커밋 (지속)합니다.

flush()항상 commit() ( 1 ) 호출의 일부로 호출됩니다.

Session 개체를 사용하여 데이터베이스를 쿼리하면 쿼리는 데이터베이스 및 보유하고있는 커밋되지 않은 트랜잭션의 플러시 된 부분 모두에서 결과를 반환합니다. 기본적으로 세션 개체 autoflush 하지만 비활성화 할 수 있습니다.

이 예제가 이것을 더 명확하게 해주길 바랍니다.

#---
s = Session()

s.add(Foo('A')) # The Foo('A') object has been added to the session.
                # It has not been committed to the database yet,
                #   but is returned as part of a query.
print 1, s.query(Foo).all()
s.commit()

#---
s2 = Session()
s2.autoflush = False

s2.add(Foo('B'))
print 2, s2.query(Foo).all() # The Foo('B') object is *not* returned
                             #   as part of this query because it hasn't
                             #   been flushed yet.
s2.flush()                   # Now, Foo('B') is in the same state as
                             #   Foo('A') was above.
print 3, s2.query(Foo).all() 
s2.rollback()                # Foo('B') has not been committed, and rolling
                             #   back the session's transaction removes it
                             #   from the session.
print 4, s2.query(Foo).all()

#---
Output:
1 [<Foo('A')>]
2 [<Foo('A')>]
3 [<Foo('A')>, <Foo('B')>]
4 [<Foo('A')>]
출처 : https://stackoverflow.com/questions/4201455/sqlalchemy-whats-the-difference-between-flush-and-commit
728x90
반응형