gorm postgres bertanya elemen dalam tatasusunan json

PHPz
Lepaskan: 2024-02-10 18:50:08
ke hadapan
410 orang telah melayarinya

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"}
Salin selepas log masuk

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]"]}';
Salin selepas log masuk

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)).
Salin selepas log masuk

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"
       }');
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!