2016-09-14 3 views
0

docs say (링크 섹션의 끝) : 세션이 데이터베이스에 새 행을 삽입즉시 대 부하에 대한 최초의 액세스 가능성

후, 새로 생성 된 식별자 및 데이터베이스 생성 기본값 인스턴스에서 즉시 사용 가능하게되거나 첫 번째 액세스로드를 통해 사용 가능하게됩니다.

immediatelyload-on-first-access의 차이점은 무엇입니까? SQLAlchemy가작업을 완료 한 후 새로운 식별자와 기본값을 알고 있지 않으므로 다시로드하지 않고도 사용할 수 없습니까?

+0

"새로 생성 된 식별자"보다 "데이터베이스 생성 기본값"이 더 중요하다고 생각합니다. – univerio

+0

@univerio 알 수 있도록 질문을 편집했습니다. – max

답변

1

SQLAlchemy는 기본 키를 가져 오는 DB에 대해 INSERT .. RETURNING을 사용하고 그렇지 않은 데이터베이스에 대해서는 mysql_insert_id과 같은 특수 기능을 사용합니다.

기본값 인 경우 RETURNING을 사용하려고하지만 지원되지 않는 경우 다른 SELECT을 사용해야합니다.

또한 특정 상황 (예 : INSERT 문이 일괄 처리되는 경우 this mailing list post 참조)에서 RETURNING (지원되는 DB에서도)을 사용할 수 없습니다.

마지막으로 SQLAlchemy는 INSERT 뒤에 기본 키만 가져옵니다. 따라서 구성되지 않은 기본 열은 "first-on-first-access"가되는 동안 기본 키만 "즉시"사용할 수 있습니다. 생성 된 값을 가져 오는 데 필요하면 server_default=FetchedValue()을 지정하십시오. (DB가 RETURNING을 지원하지 않고 열에 대해 FetchedValue을 지정하면 즉시 SELECT 값을 가져 오는지 아니면 단순히 "처음로드시로드"로 넘어갈 지 여부는 확실하지 않습니다.

1

즉시 : SQLAlchemy는 삽입 된 각 세션 개체에 대해 데이터베이스에서 기본 키를 가져 와서 세션 개체에 할당합니다. 세션 객체는 트랜잭션 스냅 샷이 커밋되기 전에 객체가 지속적 상태가되고 기본 키에서 키를 생성하는 Identity Map 컬렉션에 추가되기 때문에 즉시 기본 키가 필요합니다. [The SQLAlchemy Session - In Depth]

로드시 우선 액세스 : 개체와 관련된 데이터베이스 생성 기본값은 세션에서 절대로 사용되지 않을 수 있습니다. 따라서 리소스를 절약하기 위해 필요에 따라 lazy loaded입니다.

+0

'사용하지 못할 수도 있습니다 ': 사용하기 위해 한 번 저장이 불가능한 객체를 저장하고 검색해야하기 때문에? – max

관련 문제