SQLALCHEMY : 커밋 후 손실 된 물체 매핑?
-
06-07-2019 - |
문제
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 ()를 호출하십시오. 이는 현재 트랜잭션 내 데이터베이스에 계류중인 모든 것을 방출합니다.
나는 이것을 외국 키와 함께 사용 했으므로 두 번째 경우에는 모델을 수행 할 것입니다. 그래서 이것이 당신의 모델에 문제가 될 수 있다고 생각합니다. 그래서 당신도 그것들을 게시 할 수 있습니까?