Rumah  >  Artikel  >  pembangunan bahagian belakang  >  gorm postgres bertanya elemen dalam tatasusunan json

gorm postgres bertanya elemen dalam tatasusunan json

PHPz
PHPzke hadapan
2024-02-10 18:50:08410semak imbas

gorm postgres 查询 json 数组中的元素

gorm postgres Menanyakan elemen dalam tatasusunan json ialah keperluan biasa, terutamanya apabila berurusan dengan struktur data yang kompleks. Apabila menggunakan GORM untuk pertanyaan pangkalan data, kami boleh mencapai matlamat ini melalui beberapa teknik. Dalam artikel ini, kami akan menunjukkan kepada anda cara untuk menanyakan elemen dalam tatasusunan json menggunakan pangkalan data GORM dan Postgres. Sama ada anda seorang pemula atau pembangun berpengalaman, artikel ini akan memberikan anda panduan terperinci untuk membantu anda menyelesaikan masalah ini dengan mudah. Mari mulakan!

Kandungan soalan

Dalam projek golang saya, saya menggunakan postgres dengan gorm dan saya mempunyai lajur atribut yang mengandungi json berikut:

{"email": ["[email protected]", "[email protected]", "[email protected]"], "mail_folder": "some_folder"}
{"email": ["[email protected]", "[email protected]", "[email protected]"], "mail_folder": "some_folder"}

Jadi saya perlu mendapatkan rekod yang mengandungi e-mel [email protected] yang merupakan rekod pertama. Saya boleh mengekstraknya menggunakan sql tulen dalam editor sql menggunakan pertanyaan berikut:

select * from authors a where attributes @> '{"email": ["[email protected]"]}';

Tetapi dalam gorm saya terus mendapat ralat sintaks json dan lain-lain. Saya cuba menggunakan pertanyaan mentah() atau menggunakan

Where(fmt.Sprintf("attributes ->> 'email' = '[\"%v\"]'", email)).

Tetapi ia tidak berkesan juga. Sebarang idea tentang cara membetulkannya adalah dialu-alukan. Terima kasih.

Penyelesaian

sampledb dalam postgresql:

create table authors
(
    id         serial,
    dummy      text,
    attributes jsonb
);

insert into authors (dummy, attributes)
values ('eee', '{
  "email": [
    "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="0762626247646464296464">[email&#160;protected]</a>",
    "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="bccececefcdedede92dfdf">[email&#160;protected]</a>",
    "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="5d2929291d3e3e3e732727">[email&#160;protected]</a>"
  ],
  "mail_folder": "some_folder"
}'),
       ('zzz', '{
         "email": [
           "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="0e7474744e6d6d6d206d6d">[email&#160;protected]</a>",
           "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="b3d2d2d2f3d1d1d19dd0d0">[email&#160;protected]</a>",
           "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="a7c5c5c5e7c4c4c489dddd">[email&#160;protected]</a>"
         ],
         "mail_folder": "some_folder"
       }');

Ini berfungsi dengan baik:

package main

import (
    "fmt"
    postgres2 "github.com/jinzhu/gorm/dialects/postgres"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
    "log"
)

var (
    dsn = "host=localhost user=postgres password=secret dbname=sampledb port=5432 sslmode=disable TimeZone=europe/istanbul"
)

type Author struct {
    Id         int `gorm:"primaryKey"`
    Dummy      string
    Attributes postgres2.Jsonb `gorm:"type:jsonb;default:'{}'"`
}

var DB *gorm.DB

func main() {
    DB = initDb()
    listAuthors()
}

func listAuthors() {
    var authors []Author
    DB.Find(&authors, "attributes @> '{\"email\": [\"<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="95f0f0f0d5f6f6f6bbf6f6">[email&#160;protected]</a>\"]}'")

    for _, a := range authors {
        fmt.Printf("%d %s %s\n", a.Id, a.Dummy, a.Attributes)
    }
}

func initDb() *gorm.DB {
    db, err := gorm.Open(postgres.Open(dsn))
    if err != nil {
        log.Fatal("couldn't connect to db")
    }
    return db
}

Untuk cetakan data sampel:

1 eee {{"email": ["[email protected] ", "[email protected]", "[email protected]"], "mail_folder": "some_folder"}}

Atas ialah kandungan terperinci gorm postgres bertanya elemen dalam tatasusunan json. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam