sqlmodelを使用して、以下のようなデータがあるデータベースにレコードを挿入しようとしています。 色と多くの位置を持つ家のオブジェクト。 場所も多くの家に関連付けられます。入力は次のとおりです:
リーリーこれは私がやろうとしていることの再現可能な例です:
リーリー問題は、このコードを実行すると、家オブジェクトとともに重複した場所オブジェクトを挿入しようとすることです。
house.locations
へのアクセスが非常に簡単になるため、ここで relationship
を使用できるようにしたいと考えています。
ただし、重複した位置を挿入しようとするのを止める方法がわかりません。理想的には、get_or_create
の位置を実行するマッパー関数が必要です。
これを行うために私が見た中で最高のものは、sqlalchemy に関連するプロキシです。しかし、sqlmodelはこれをサポートしていないようです。
これを達成する方法を知っている人はいますか? sqlmodel の代わりに sqlalchemy を使用してこれを実現する方法をご存知の場合は、その解決策を見てみたいと思います。このプロジェクトはまだ開始していないので、作業が楽になるのであれば sqlalchemy を使用するのもよいでしょう。
私も sa_relationship_kwargs
を使って
ただし、これにより、関連するエントリが houselocationlink
テーブルに追加されなくなります。
ご指摘をいただければ幸いです。たとえそれが私のアプローチを完全に変えることを意味するとしても。
###ありがとう!sqlalchemyを使用したいとおっしゃっていたので、この解決策を書いています。前述したように、関連付けられたプロキシが必要ですが、
「一意のオブジェクト」も必要です。私の個人的な好みに合わせて、ロジックを大幅に変更することなく、(同期ではなく) 非同期クエリが機能するようにこれを調整しました。
リーリー
house オブジェクトと対応する
houselocationlink のみが追加され、新しい
location オブジェクトは追加されないことがわかります。この動作をキャッシュするために、キーと値のペアごとに 1 つのクエリのみが作成されます。
以上がリレーションシップの一方の側がすでにデータベースに存在する場合に、SQLModel を使用して多対多のリレーションシップ オブジェクトを挿入するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。