Programing

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

lottogame 2020. 2. 27. 22:03
반응형

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


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

나는 문서를 읽었지만 더 현명한 사람은 아닙니다-그들은 내가없는 사전 이해를 가정합니다.

특히 메모리 사용에 미치는 영향에 관심이 있습니다. 일련의 파일 (약 5 백만 행)에서 데이터베이스로 일부 데이터를로드하고 있으며 세션이 때때로 넘어갑니다. 대량 데이터베이스이며 메모리가 많지 않은 컴퓨터입니다.

전화 를 너무 많이 사용하고 commit()있고 충분하지 않은지 궁금합니다. flush()그러나 차이점을 실제로 이해하지 못하면 말하기가 어렵습니다!


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

세션 객체는에 트랜잭션 작업을 등록 session.add()하지만 session.flush()호출 될 때까지 아직 데이터베이스와 통신하지 않습니다 .

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

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

flush()되어 항상 에 대한 호출의 일환으로 불리는 commit()( 1 ).

Session 개체를 사용하여 데이터베이스를 쿼리하면 쿼리는 데이터베이스와 커밋되지 않은 커밋되지 않은 트랜잭션의 플러시 된 부분 모두에서 결과를 반환합니다. 기본적으로 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')>]

@snapshoe가 말한 것처럼

flush() SQL 문을 데이터베이스로 보냅니다.

commit() 트랜잭션을 커밋합니다.

언제 session.autocommit == False:

commit()flush()설정 하면 전화 합니다 autoflush == True.

언제 session.autocommit == True:

commit()트랜잭션을 시작하지 않은 경우 전화를 걸 수 없습니다 (트랜잭션을 수동으로 관리하는 것을 피하기 위해이 모드 만 사용하지 않았을 수도 있음).

이 모드에서는 flush()ORM 변경 사항을 저장하기 위해 전화해야합니다 . 플러시는 효과적으로 데이터를 커밋합니다.

참고 URL : https://stackoverflow.com/questions/4201455/sqlalchemy-whats-the-difference-between-flush-and-commit



반응형