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
'Programing' 카테고리의 다른 글
스위프트의 정밀 문자열 형식 지정자 (0) | 2020.02.27 |
---|---|
WCF와 ASMX 웹 서비스의 차이점은 무엇입니까? (0) | 2020.02.27 |
PDF를 텍스트로 변환하는 Python 모듈 (0) | 2020.02.27 |
Node.js가있는 MySQL (0) | 2020.02.27 |
Express.js-app.listen 및 server.listen (0) | 2020.02.27 |