Maison > développement back-end > Golang > gorm postgres interroge les éléments du tableau json

gorm postgres interroge les éléments du tableau json

PHPz
Libérer: 2024-02-10 18:50:08
avant
461 Les gens l'ont consulté

gorm postgres 查询 json 数组中的元素

gorm postgres Interroger des éléments dans un tableau json est un besoin courant, en particulier lorsqu'il s'agit de structures de données complexes. Lorsque nous utilisons GORM pour les requêtes de base de données, nous pouvons atteindre cet objectif grâce à certaines techniques. Dans cet article, nous allons vous montrer comment interroger des éléments dans un tableau json à l'aide de la base de données GORM et Postgres. Que vous soyez débutant ou développeur expérimenté, cet article vous fournira des conseils détaillés pour vous aider à résoudre facilement ce problème. commençons!

Contenu de la question

Dans mon projet golang, j'utilise postgres avec gorm et j'ai une colonne d'attributs contenant le json suivant :

{"email": ["[email protected]", "[email protected]", "[email protected]"], "mail_folder": "some_folder"}
{"email": ["[email protected]", "[email protected]", "[email protected]"], "mail_folder": "some_folder"}
Copier après la connexion

J'ai donc besoin d'obtenir l'enregistrement contenant l'email [email protected] qui est le premier enregistrement. Je peux l'extraire en utilisant du SQL pur dans l'éditeur SQL en utilisant la requête suivante :

select * from authors a where attributes @> '{"email": ["[email protected]"]}';
Copier après la connexion

Mais dans Gorm, je continue à recevoir de mauvaises erreurs de syntaxe json, etc. J'ai essayé d'utiliser la requête raw() ou d'utiliser

Where(fmt.Sprintf("attributes ->> 'email' = '[\"%v\"]'", email)).
Copier après la connexion

Mais ça ne marche pas non plus. Toute idée sur la façon de résoudre ce problème serait la bienvenue. Merci.

Solution

sampledb dans 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"
       }');
Copier après la connexion

Cela fonctionne bien :

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
}
Copier après la connexion

Pour l'impression de données d'échantillon :

1 eee {{"email": ["[email protégé] ", "[email protégé]", "[email protégé]"], "mail_folder": "some_folder"}}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal