5

データベースに永続化されたものと変わらないように、オブジェクトをセッションにアタッチする必要があります。(コードで説明する方が簡単です):

session.query(type(some_object)).filter_by(id=some_object.id).one()

それを行うより適切な方法はありますか? session.add(some_object)そのようなIDを持つエンティティはすでにこのセッションにアタッチされている可能性があるobject = session.merge(some_object)ため機能しません。また、デタッチされたコピーから状態を変換するため、機能しません(object.name = 'asdfasdf'を作成すると、これらの変更はマージ後に保留されます物体)

編集:

私は少し醜い方法を見つけました:

some_object = session.merge(some_object)
session.refresh(some_object)

しかし、これを 1 回の呼び出しで行う方法はありますか?

4

1 に答える 1

5

データベースに永続化されたものと変わらないように、オブジェクトをセッションにアタッチする必要があります。

「DBと変わらない」ということは、ロードしようとしていることを意味しているので、クエリを実行してください。オブジェクトがそのターゲット セッションに既に存在している可能性があることを考慮する必要がある場合があります。get() を使用して主キーを直接ヒットし、 populate_existing() を使用して、セッションに既に存在する状態が上書きされることを保証できますが、 query(type(object)) を使用したアプローチがおそらく最も直接的です。

session.query(type(some_object)).populate_existing().get(some_object.id)

上記は、ほぼ同じコードパスを呼び出しますrefresh()。あなたが持っているマージ/リフレッシュアプ​​ローチも機能しますが、少なくとも 2 つの SELECT 呼び出しを発行します。

于 2012-09-01T13:45:11.883 に答える