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

Gorm Postgres fragt Elemente im JSON-Array ab

PHPz
Freigeben: 2024-02-10 18:50:08
nach vorne
452 Leute haben es durchsucht

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"}
Nach dem Login kopieren

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]"]}';
Nach dem Login kopieren

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)).
Nach dem Login kopieren

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"
       }');
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage