내 코드는 다음과 같습니다
try:
return session.query(Phone).populate_existing().filter(Phone.mac == ident).one()
except:
return self.createMockPhoneFromLicenseFile(ident)
def createMockPhoneFromLicenseFile(self, ident):
# Some code to read necessary data from file deleted....
phone = Phone()
phone.mac = foo
phone.data = bar
phone.state = "Read from legacy file"
phone.purchaseOrderPosition = self.getLegacyOrder(ident)
# SQLAlchemy magic doesn't seem to work here, probably because we don't insert the created
# phone object into the database. So we set the id fields manually.
phone.order_id = phone.purchaseOrderPosition.order_id
phone.order_position_id = phone.purchaseOrderPosition.order_position_id
return phone
모든 것이 SQLAlchemy의는 다행히 성공하지 않는 데이터베이스에 생성 된 전화 개체를 (쓰려고 응용 프로그램에서 나중에 실행되는 session.flush()
에 대한 것을 제외하고 잘 작동 phone.state이기 때문에 데이터 유형이 허용하는 것보다 긴 경우), 플러시를 발행하는 함수를 중단시킵니다.
SQLAlchemy에서 이러한 개체를 쓰지 못하게 할 방법이 있습니까?
업데이트
내가 (엘릭서 문서 (어쩌면 당신이 링크를 제공 할 수 있습니까?), 그것은 나에게 가치가 시도를 보였다에서
using_mapper_options(save_on_init=False)
아무것도 발견하지 않았지만 나는 것 전체 개체 대신 단일 인스턴스가 작성되는 것을 방지하는 방법을 선호했습니다.
처음에는 문이 아무 효과가없는 것처럼 보였고 SQLAlchemy/Elixir 버전이 너무 오래되었다고 생각했지만 그 다음에 PurchaseOrderPosition 엔터티 (수정하지 않은 항목)에 대한 연결이
으로 이루어진 것으로 나타났습니다.phone.purchaseOrderPosition = self.getLegacyOrder(ident)
전화 개체가 다시 기록됩니다. 진술을 삭제하면 모든 것이 잘된 것 같습니다.
답변을 업데이트했습니다. –