LoginSignup
0
0

More than 3 years have passed since last update.

sqlalchemyでparent idを取得する方法

Posted at

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を付与するなど)
できれば親データと子データは同じセッションでコミットした方がインサートが効率的になります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0