parent_idを自動で採番したい
データベースにおいてデータの親子関係の情報を入れたい場合に必要になります。
例えば、あるホテルに複数の部屋が紐づいている場合やあるサービスに複数のプランが紐づいている場合などです。
重要なポイントは以下の2点です。
1. 子データの格納前に親データのIDを取得する必要がある
2. 子データの格納でエラーとなった場合は親データの格納前までロールバックする必要がある
sqlalchemyの場合はsession.flush()を使う
session.add(parent_record) # トランザクションの登録
session.fluhs() # DBへの登録(保存はされない)
parent_id = parent_record.id # 親IDの取得
session.add(record)の時点では親データのIDがふられていないため、取得できません。
session.flush()することで親IDがふられ、取得できるようになります。
session.commit()を使わない理由
session.add(parent_record)
session.commit() # DBへの登録(保存はされる)
parent_id = parent_record.id # 親IDの取得
session.commit()でデータベースに格納でき、親IDが振られるため取得することができます。
ただし、重要ポイント2で言及しているロールバックができなくなってしまうため、子データで格納に失敗すると、親データだけ格納されている状況が発生してしまい、子データの登録時に手間がかかってしまいます。(手動で親IDを付与するなど)
できれば親データと子データは同じセッションでコミットした方がインサートが効率的になります。