SQLAlchemyで取得したレコードをコピーして新しいレコードとして挿入する際、
カラムが多いとレコードインスタンスを作成したときにカラムごとに代入していくのがだるいので動的に値をセットできるようにする際の議事録です。
# 既存のレコードを取得
existing_record = session.query(YourModel).filter(
YourModel.id == record_id
).first()
# 新しいレコードインスタンスを作成
new_record = YourModel()
# 既存のレコードから新しいレコードへ属性をコピー
for column in YourModel.__table__.columns:
setattr(new_record, column.name, getattr(existing_record, column.name))
# IDや他の一意性制約があるカラムの値を削除または変更
new_record.id = None # IDが自動生成される場合、Noneに設定
# 新しいレコードをセッションに追加してコミット
session.add(new_record)
session.commit()
YourModel.__table__.columns
を使うことでモデルに定義したカラム一覧が取得できます。
ループで回し、setattr
とgetattr
を組み合わせることでオブジェクトに値を動的に取得、代入することができます。