2012-04-14 5 views
8

항상 어설 션합니까? 즉, 세션에 새 객체를 추가 할 때 SQLAlchemy가 순서를 저장합니까 (INSERT 쿼리 생성시)?SQLAlchemy는 세션에 개체를 추가 할 때 순서를 저장합니까?

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm.session import sessionmaker 
from sqlalchemy.engine import create_engine 
from sqlalchemy.types import Integer 
from sqlalchemy.schema import Column 

engine = create_engine('sqlite://') 
Base = declarative_base(engine) 
Session = sessionmaker(bind=engine) 
session = Session() 

class Entity(Base): 
    __tablename__ = 'entity' 
    id = Column(Integer(), primary_key=True) 
Entity.__table__.create(checkfirst=True) 


first = Entity() 
session.add(first) 

second = Entity() 
session.add(second) 

session.commit() 
assert second.id > first.id 
print(first.id, second.id) 

없음, 프로덕션 환경에서는 postgresql을 사용하고 sqlite는 테스트 용입니다.

+1

나는 이것을 (많은 장소에서'dict'와'set's) 그렇게하는 원인이되는 sqlalchemy에서 코드를 찾을 수 없으며 또한 매력적인 반례 예를 만들 수 없다 (시퀀스에서 비 단조의 부족), +1 +1 – SingleNegationElimination

답변

-2

아니요, 커밋 할 때 사용하면됩니다. 추가 할 때 사용하지 않습니다. 이 삽입되었을 때

+0

나는 쿼리가 flush() 또는 commit()에서 db로 전송된다는 것을 알고있었습니다. 하지만 sqlalchemy는 session.add() 명령의 순서로 INSERT 쿼리를 생성합니다. (위의 Entity 클래스와 포스트그레스로 테스트) –

+0

예 삽입 쿼리를 생성하지만 시퀀스 번호를 증가시키는 삽입시 실행되는 트리거가있을 수 있으므로 ID (기본 키)는 db에 의해 결정될 수 있습니다. . – rapadura

+1

원래의 Asker는 커밋시 INSERT 문이 추가 된 순서대로 출력되는지 여부를 궁금해합니다. Upvoted, 왜냐하면 나는 같은 것을 궁금해 하니까. // 편집 : 알아 냈어! 약간의 응답. – munchybunch

5

은 SQLAlchemy의 소스에서 조금 찾고 후에는 add() 기록과 같다 : https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/session.py#L1719

관련 조각 :

def _save_impl(self, state): 
    if state.key is not None: 
     raise sa_exc.InvalidRequestError(
      "Object '%s' already has an identity - it can't be registered " 
      "as pending" % state_str(state)) 

    self._before_attach(state) 
    if state not in self._new: 
     self._new[state] = state.obj() 
     state.insert_order = len(self._new) # THE INSERT ORDER IS SAVED! 
    self._attach(state) 

그리고이 Session.add =>self._save_or_update_state =에서 호출>self._save_or_update_impl =>self._save_impl 저장할 때

그런 다음 _sort_states에 사용되는 : https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/persistence.py#L859

불행하게도, 이것은 단지 구현 수준의 증거입니다. 내가 ...

업데이트 그것을 보장하는 문서에서 아무것도 찾을 수 없습니다 :보기에 조금 보았다부터 나는했습니다 를, 그것은 SQLAlchemy의에서 일의 단위라는 개념이있다 밝혀 그 flush 중에 다소 순서를 정의합니다 : http://www.aosabook.org/en/sqlalchemy.html (작업 단위 (Unit of Work) 검색).

동일한 클래스 내에서 순서는 실제로 add이 호출 된 순서에 따라 결정됩니다. 그러나 다른 클래스 사이의 INSERT에서 다른 순서가 표시 될 수 있습니다. A 유형의 객체 a을 추가하고 나중에 B 유형의 객체 b을 추가하는 경우는 외부 키가 b 인 것으로 밝혀지면 a에 대한 INSERT 전에 b에 대한 INSERT가 표시됩니다.

+0

이것은 올바른 대답입니다. – zzzeek

관련 문제