Heim  >  Artikel  >  Backend-Entwicklung  >  Gorm Postgres fragt Elemente im JSON-Array ab

Gorm Postgres fragt Elemente im JSON-Array ab

PHPz
PHPznach vorne
2024-02-10 18:50:08411Durchsuche

gorm postgres 查询 json 数组中的元素

gorm postgres Das Abfragen von Elementen in einem JSON-Array ist ein häufiger Bedarf, insbesondere beim Umgang mit komplexen Datenstrukturen. Wenn wir GORM für Datenbankabfragen verwenden, können wir dieses Ziel durch einige Techniken erreichen. In diesem Artikel zeigen wir Ihnen, wie Sie Elemente in einem JSON-Array mithilfe der GORM- und Postgres-Datenbank abfragen. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, bietet Ihnen dieser Artikel detaillierte Anleitungen, die Ihnen bei der einfachen Lösung dieses Problems helfen. Lasst uns beginnen!

Frageninhalt

In meinem Golang-Projekt verwende ich Postgres mit Gorm und ich habe eine Attributspalte mit dem folgenden JSON:

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

Ich brauche also den Datensatz mit der E-Mail [email protected], der der erste Datensatz ist. Ich kann es mit reinem SQL im SQL-Editor mit der folgenden Abfrage extrahieren:

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

Aber in Gorm bekomme ich immer wieder schlechte JSON-Syntaxfehler usw. Ich habe versucht, die Abfrage raw() oder

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

Aber es funktioniert auch nicht. Irgendwelche Ideen, wie man das Problem beheben kann, wären willkommen. Danke.

Lösung

sampledb in 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"
       }');

Das funktioniert gut:

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
}

Für den Beispieldatendruck:

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

Das obige ist der detaillierte Inhalt vonGorm Postgres fragt Elemente im JSON-Array ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen