23

orm を使用して、SQLAlchemy でモデル インスタンス (行) を複製したいと考えています。私の最初の考えはこれを行うことでした:

i = session.query(Model)
session.expunge(i)

old_id = i.id
i.id = None
session.add(i)
session.flush()
print i.id #New ID

ただし、切り離されている間にIDをNoneに設定しても、切り離されたオブジェクトはまだIDを「記憶」しているようです。したがって、session.flush() は主キーを null に変更する UPDATE を実行しようとします。

これは予想される動作ですか?この属性の「メモリ」を削除し、切り離されたオブジェクトをセッションに再度追加するときに新しいオブジェクトとして扱うにはどうすればよいですか? 一般に、SQLAlchemy モデル インスタンスをどのように複製しますか?

4

2 に答える 2

41

このケースは、 make_transient()ヘルパー関数を使用して利用できます。

inst = session.query(Model).first()
session.expunge(inst)

make_transient(inst)
inst.id = None
session.add(inst)
session.flush()
print inst.id #New ID
于 2013-02-02T00:04:24.313 に答える