Gorm での JSONB データの処理
Postgres で Gorm を使用して JSONB データを管理すると、特に文字列のスライスを操作する場合に課題が生じる可能性があります。ここでは、利用可能なオプションの詳細な検査を示します:
postgres.Jsonb の使用:
Gorm は、JSONB 操作用に設計された特定の型 postgres.Jsonb を提供します。この方法は簡単なアプローチですが、Gorm 固有の型の使用を避けたいシナリオには理想的ではない可能性があります。
文字列のスライス:
Go 構造体を定義するとき文字列のスライスを作成し、それを JSONB オブジェクトとしてマッピングしようとすると、Gorm で問題が発生する可能性があります。このアプローチを選択した場合は、以下に示すように sql タグと json タグを明示的に指定する必要があります:
type User struct { gorm.Model Data []string `sql:"type:jsonb" json:"data"` }
ただし、このアプローチでは AutoMigrate の実行中にパニックがトリガーされる可能性があります。
ネストStruct:
パニックの問題を回避するには、ネストされた文字列のスライスをラップします。 struct:
type User struct { gorm.Model Data struct { NestedData []string } `sql:"type:jsonb" json:"data"` }
この手法によりクラッシュは防止されますが、Postgres で意図した列が作成されない可能性があります。
pgtype.JSONB を使用した代替ソリューション:
推奨されるアプローチこれには、Gorm の基礎となるドライバーである pgx で利用可能な pgtype.JSONB タイプの利用が含まれます。このメソッドにより、カスタム コードの必要性がなくなり、文字列スライスを超えて任意の JSONB タイプを操作できるようになります。
pgtype.JSONB の使用方法の例を次に示します。
type User struct { gorm.Model Data pgtype.JSONB `gorm:"type:jsonb;default:'[]';not null"` }
データを取得するにはデータベース:
u := User{} db.Find(&u) var data []string _ = u.Data.AssignTo(&data)
内のデータを更新するにはデータベース:
u := User{} _ = u.Data.Set([]string{"abc", "def"}) db.Updates(&u)
このアプローチを活用すると、postgres.Jsonb タイプを使用せずに Gorm で JSONB データを効果的に管理できます。
以上がGorm と PostgreSQL を使用して JSONB データ、特に文字列スライスを効率的に管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。