2011-09-19 6 views

답변

15

다음은 documentation의 관련 인용문입니다.

플러시는 다음 Session가 기본 구성으로 사용됩니다

, 플러시 단계는 거의 항상 투명하게 이루어집니다. 특히 플러시 은 트랜잭션이 커밋되기 전에 commit() 호출 내에서뿐만 아니라까지 발생합니다.

커밋 : 현재 트랜잭션을 커밋하는 데 사용됩니다

commit(). 항상 데이터베이스에 남아있는 상태를 플러시하기 위해 flush()을 발행합니다.; 이 은 "autoflush"설정과 독립적입니다. 트랜잭션이 없으면 오류가 발생합니다. 세션의 기본 동작은 "트랜잭션"이 항상 존재한다는 것입니다. 이 동작은 autocommit=True으로 설정하여 을 비활성화 할 수 있습니다. 자동 커밋 모드에서 트랜잭션을 호출하려면 begin() 메서드를 호출하면됩니다.

4

스트레이트

commit()는 현재 트랜잭션을 커밋하는 데 사용됩니다. 항상 flush()을 발행하여 데이터베이스에 남아있는 모든 상태를 플러시합니다.

9

나는이하는 일을 설명하는 방법을 알고있는 가장 쉬운 방법은 echo=True를 사용하여, 당신이 단지를 보여주는 것입니다 :

>>> session.flush() 
BEGIN (implicit) 
INSERT INTO users (username, password) VALUES (?, ?) 
('alice', None) 
>>> session.commit() 
COMMIT 
>>> 

flush()는 데이터가 데이터베이스로 전송됩니다. commit()COMMIT으로, 방금 보낸 데이터를 보관하도록 데이터베이스에 알립니다. 다른 사람들이 말했듯이, commit()은 필요하다면 flush()을 발생시킵니다.

3

위의 대답은 정확하지만 플러시의 가장 유용한 기능은 데이터베이스의 테이블에 대한 변경 사항을 코드의 관련 개체에 적용하는 것입니다. 다음은 예입니다,

u = User(name,address,phone) #id is autogenerated 
session.add(u) 
session.commit() #calls flush beforehand, but we need it after the commit 
session.flush() #updates the objects of the session 
print(u.id) #id field of the User object updated after the flush 

당신은 자신의 ID를 얻기 위해 다시 쿼리 할 필요가 없습니다, 당신은 사용자를 등록한다고 가정 당신은 자신의 ID를 돌려주고 싶어!이것은 메모리에 객체/객체의 현재 상태로 데이터베이스를 동기화합니다

0

flush()을 할 수 있지만 트랜잭션을 커밋하지 않습니다 바랍니다. 따라서 flush()이 호출 된 후에 예외가 발생하면 트랜잭션이 롤백됩니다. commit()을 사용하여 큰 데이터를 한 번에 커밋하는 대신를 사용하여 작은 데이터 청크로 데이터베이스를 동기화 할 수 있으며 Out Of Memory 예외가 발생할 위험이 있습니다.

commit()은 데이터베이스에 저장된 데이터를 영구적으로 유지합니다. commit()이 성공하면 거래를 롤백 할 수 없습니다.

출처 : https://stackoverflow.com/a/26976077/4115031

관련 문제