SQLX を使用してネストされた構造体を効果的にスキャンするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-22 09:07:14
オリジナル
355 人が閲覧しました

How to Effectively Scan Nested Structs Using SQLX?

構造体内の構造体: SQLX の高度なスキャンに関するガイド

SQLX を使用しているときに、ネストされた構造体にデータをスキャンするときに問題が発生する場合があります。次の例を考えてみましょう:

type Customer struct {
   Id     int    `json:"id" db:"id"`
   Name   string `json:"name" db:"name"`
   Address Address `json:"adress"` // Oops, missing embedded property
}
type Address struct {
   Street string `json:"street" db:"street"`
   City   string `json:"city" db:"city"`
}
ログイン後にコピー

この定義を使用してデータをスキャンしようとすると、次のエラーが発生します:

missing destination name street in *models.Customer
ログイン後にコピー

解決策: Embedded Structs を採用する

この問題を解決する鍵は、SQLX のディープ スキャン機能を理解することにあります。ドキュメントが示唆しているように、構造体の埋め込みをサポートし、そのフィールドを親構造体にプロモートします。これを実現するには、Address を Customer:

type Customer struct {
   Id     int    `json:"id" db:"id"`
   Name   string `json:"name" db:"name"`
   Address Address
}
ログイン後にコピー

に埋め込むだけです。Address フィールド自体の db タグは別個のエンティティではなくなったため、削除したことに注意してください。

注意: フラット化JSON 出力

ただし、Address を埋め込むと Customer 構造体の JSON 出力がフラット化されます。 Name と City の両方が直接プロパティになりました:

{
    "id": 1,
    "name": "foo",
    "street": "bar",
    "city": "baz"
}
ログイン後にコピー

可能な代替手段

これが望ましくない場合は、いくつかの代替アプローチがあります:

  1. 再マッピング: データをマップ[文字列]インターフェース{}にスキャンし、カスタム ロジックを使用して再マップします。
  2. インターフェイス タイプの定義: 目的のデータ構造を表すインターフェイスを作成し、Address 構造体と Customer 構造体の両方を使用して実装します。

以上がSQLX を使用してネストされた構造体を効果的にスキャンするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート