답변:
샘플 코드는 그대로 작동해야합니다. SQLAlchemy는 f.id
자동 생성 기본 키 열로 가정하여에 대한 값을 제공해야합니다 . 기본 키 속성은 flush()
생성되는 즉시 프로세스 내에서 채워 지며에 대한 호출 commit()
이 필요하지 않습니다. 따라서 여기에 대한 답은 다음 중 하나 이상에 있습니다.
나는 방금 동일한 문제를 겪었고 테스트 후 이러한 답변 중 어느 것도 충분하지 않다는 것을 발견했습니다.
현재 또는 sqlalchemy .6+부터는 매우 간단한 솔루션이 있습니다 (이전 버전에 존재하는지 여부는 알 수 없습니다.
session.refresh ()
따라서 코드는 다음과 같습니다.
f = Foo(bar=x)
session.add(f)
session.flush()
# At this point, the object f has been pushed to the DB,
# and has been automatically assigned a unique primary key id
f.id
# is None
session.refresh(f)
# refresh updates given object in the session with its state in the DB
# (and can also only refresh certain attributes - search for documentation)
f.id
# is the automatically assigned primary key ID given in the database.
그렇게하는 방법입니다.
sessionmaker(autoflush=True)
콤보 w / refresh ()를 사용하여 행 ID를 제공했습니다. #grrr
flush()
사용 commit()
과 오른쪽 그 이후 -로 새로 고침은 session.refresh(f)
나를 위해 작동하고, 나는 SQLAlchemy의 버전을 사용0.6.7
dpb가 제공하는 답변과 달리 새로 고침이 필요하지 않습니다. 일단 플러시하면 id 필드에 액세스 할 수 있으며 sqlalchemy는 백엔드에서 자동으로 생성 된 ID를 자동으로 새로 고칩니다.
나는이 문제에 직면하고 몇 가지 조사 후 정확한 이유를 알아 냈고, 내 모델은 정수 필드로 ID로 생성되었으며 내 양식에서는 ID가 hiddenfield로 표시되었습니다 (내 양식에 ID를 표시하고 싶지 않았기 때문에). 숨겨진 필드는 기본적으로 텍스트로 표시됩니다. widget = hiddenInput ())을 사용하여 양식을 integerfield로 변경하면 문제가 해결되었습니다.
session.save_or_update(f)
대신을 사용해보십시오 session.add(f)
.
save_or_update
0.5 정도부터 사용되지 않습니다. session.add()
해야합니다.
echo=True
하고 플러시 시간에 어떤 SQL이 실행되는지 확인할 수 있습니까? 설명하는 내용 이 작동하고 ID를 제공 해야 하지만 f.id가 없음이되는 다른 문제가있을 수 있습니다.