This source詳細アソシエーションプロキシを使用して、ORMオブジェクトの値を持つビューとオブジェクトを作成する方法。アソシエーションプロキシSQLAlchemy
ただし、データベース内の既存のオブジェクトと一致する値を追加すると、その値は一意のキーまたは主キーです。競合するオブジェクトが作成されるため、コミットできません。
私の場合、これはビューとしてのみ有用であり、ORMクエリを使用して追加するオブジェクトを取得する必要があります。
これは私の唯一のオプションですか、またはマージを使用できますか(プライマリキーでユニークな制約でない場合にのみこれを行うことができます)、またはコンストラクタを設定して、既存のオブジェクトを使用します新しいオブジェクトを作成するのではなく、存在する場合はデータベース?ドキュメントから例えば
:
user.keywords.append('cheese inspector')
# Is translated by the association proxy into the operation:
user.kw.append(Keyword('cheese inspector'))
しかし、私はより多くのようなものに変換されるようにしたいと思います。(もちろん、クエリが失敗する可能性があります)。
keyword = session.query(Keyword).filter(Keyword.keyword == 'cheese inspector').one()
user.kw.append(keyword)
OR理想的
user.kw.append(Keyword('cheese inspector'))
session.merge() # retrieves identical object from the database, or keeps new one
session.commit() # success!
私はこれも良いアイデアではないかもしれないが、それは特定のユースケースになる可能性が想定:)
チェックしていない)。私の質問は、私の特定のユースケース(私が追加するたびに新しいオブジェクトを作成するのではなく、可能であればdbの既存オブジェクトを使用する)のために、そのサンプルの動作をもっと変化させることです。 –
@DerekLitz:公正な...あなたの質問にリンクされているドキュメントに基づいて答えを変えてくれるでしょう... – van
ええ、その方法はうまくいくように見え、 '__init__'を定義することよりも優れていますそれはすべてのオブジェクトがそのようにインスタンス化されなければならないようにするか、またはメソッドにいくらか複雑さを加えるようにするため、同じことをします。私はいくつかの間違いに気付きました。それは私があまりよく分からなかった問題の一つです。挿入の前にクエリを実行するためにセッションを取得する最善の方法は何ですか?あなたのコードには、 'session.query(Keyword).filter(Keyword.keyword = kw)'のようなオブジェクトのセッションで行う必要があるため、クエリにバグがあります。 –