リレーションシップの一方の側がすでにデータベースに存在する場合に、SQLModel を使用して多対多のリレーションシップ オブジェクトを挿入する

WBOY
リリース: 2024-02-06 08:00:10
転載
1288 人が閲覧しました

当关系的一侧已存在于数据库中时,使用 SQLModel 插入多对多关系对象

質問内容

sqlmodelを使用して、以下のようなデータがあるデータベースにレコードを挿入しようとしています。 色と多くの位置を持つ家のオブジェクト。 場所も多くの家に関連付けられます。入力は次のとおりです:

リーリー

これは私がやろうとしていることの再現可能な例です:

リーリー

問題は、このコードを実行すると、家オブジェクトとともに重複した場所オブジェクトを挿入しようとすることです。 house.locations へのアクセスが非常に簡単になるため、ここで relationship を使用できるようにしたいと考えています。

ただし、重複した位置を挿入しようとするのを止める方法がわかりません。理想的には、get_or_create の位置を実行するマッパー関数が必要です。

これを行うために私が見た中で最高のものは、sqlalchemy に関連するプロキシです。しかし、sqlmodelはこれをサポートしていないようです。

これを達成する方法を知っている人はいますか? sqlmodel の代わりに sqlalchemy を使用してこれを実現する方法をご存知の場合は、その解決策を見てみたいと思います。このプロジェクトはまだ開始していないので、作業が楽になるのであれば sqlalchemy を使用するのもよいでしょう。

私も sa_relationship_kwargs を使って

のように調整してみました リーリー

ただし、これにより、関連するエントリが houselocationlink テーブルに追加されなくなります。

ご指摘をいただければ幸いです。たとえそれが私のアプローチを完全に変えることを意味するとしても。

###ありがとう!


正解


sqlalchemyを使用したいとおっしゃっていたので、この解決策を書いています。前述したように、関連付けられたプロキシが必要ですが、「一意のオブジェクト」も必要です。私の個人的な好みに合わせて、ロジックを大幅に変更することなく、(同期ではなく) 非同期クエリが機能するようにこれを調整しました。 リーリー

アサーションが通過し、一意の制約に違反しておらず、複数の挿入がないことがわかります。このコードの「重要な」側面について言及したインライン コメントをいくつか残しました。このコードを複数回実行すると、新しい

house オブジェクトと対応する houselocationlink のみが追加され、新しい location オブジェクトは追加されないことがわかります。この動作をキャッシュするために、キーと値のペアごとに 1 つのクエリのみが作成されます。

以上がリレーションシップの一方の側がすでにデータベースに存在する場合に、SQLModel を使用して多対多のリレーションシップ オブジェクトを挿入するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!