문제

Sqlalchemy에서는 간단한 문제가 발생했습니다. 테이블에 하나의 모델이 있습니다. 여기에서 model1이라고 부릅니다. 이 테이블에 행을 추가하고 자동화 된 키를 가져 와서 다른 모델을 만들고이 키를 사용할 수 있습니다. 이것은 결함이있는 데이터베이스 설계가 아닙니다 (1 : 1 관계 등). 다른 테이블이 원격 호스트로 전송되기 때문에 다른 테이블 에이 키가 필요합니다. 서버가 서로를 이해할 수 있도록 일치 키가 필요합니다. 이 두 테이블 사이에는 더 이상의 로컬 참조가 없을 것이며, 그로 인해 관계를 만들 수도 있습니다.

다음 코드를 고려하십시오.

object1 = model.Model1(param)
DBSession.add(object1)

# if I do this, the line below fails with an UnboundExecutionError.
# and if I dont do this, object1.id won't be set yet
#transaction.commit()

object2 = model.AnotherModel(object1.id) #id holds the primary, autoincremented key

나는 "수동으로"커밋 할 필요조차 없기를 바랐다. 기본적으로 내가 달성하고자하는 것은 "Model1"은 끊임없이 성장하고 있으며 Model.ID 기본 키가 증가하고 있습니다. 또 다른 모델은 항상 Model1의 약간의 일부일 뿐이며 아직 처리되지 않았습니다. 물론 이미 처리 된 요소를 표시하기 위해 테이블의 부울 필드 인 "Model1"에 플래그를 추가 할 수 있었지만 이것이 필요하지 않기를 바랐습니다.

위의 코드를 어떻게 작동시킬 수 있습니까?

인사,

도움이 되었습니까?

해결책

몇 가지 :

  • 변수가 무엇인지 설명해 주시겠습니까? transaction 묶여 있습니까?
  • 정확히 어떤 진술이 UnboundexecutionError를 제기합니까?
  • 스택 추적을 포함한 전체 예외 메시지를 제공하십시오.
  • 이 경우에해야 할 '정상적인'일은 전화하는 것입니다. DBSession.flush(). 당신은 그것을 시도 했습니까?

예시:

object1 = Model1(param)
DBSession.add(object1)
DBSession.flush()
assert object1.id != None # flushing the session populates the id

object2 = AnotherModel(object1.id)

SA 세션에 대한 훌륭한 설명과 flush() 그렇습니다 세션 사용.

원래, flush() 보류중인 인스턴스가 영구적으로 발생합니다. 즉, 새 개체가 데이터베이스 테이블에 삽입됩니다. flush() 또한 세션이 변경되는 인스턴스의 값으로 테이블을 업데이트합니다.

commit() 항상 문제 flush() 첫 번째.

거래 내에서 여러 번 플러시 할 수 있습니다. 각 플러시 ()는 데이터베이스에서 업데이트 및/또는 삽입을 유발합니다. 전체 트랜잭션은 헌신적이거나 롤백 될 수 있습니다.

다른 팁

새로운 기본 키 식별자가 커밋되지 않고 생성하려면 Session.Flush ()를 호출하십시오. 이는 현재 트랜잭션 내 데이터베이스에 계류중인 모든 것을 방출합니다.

나는 이것을 외국 키와 함께 사용 했으므로 두 번째 경우에는 모델을 수행 할 것입니다. 그래서 이것이 당신의 모델에 문제가 될 수 있다고 생각합니다. 그래서 당신도 그것들을 게시 할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top