ホームページ  >  記事  >  バックエンド開発  >  リレーションシップの一方の側がすでにデータベースに存在する場合に、SQLModel を使用して多対多のリレーションシップ オブジェクトを挿入する

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

WBOY
WBOY転載
2024-02-06 08:00:101294ブラウズ

当关系的一侧已存在于数据库中时,使用 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 までご連絡ください。