ホームページ >バックエンド開発 >Golang >Gorm と PostgreSQL を使用して JSONB データ、特に文字列スライスを効率的に管理するにはどうすればよいですか?

Gorm と PostgreSQL を使用して JSONB データ、特に文字列スライスを効率的に管理するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-25 02:25:12968ブラウズ

How to Efficiently Manage JSONB Data, Especially String Slices, with Gorm and PostgreSQL?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。