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

gorm postgres interroge les éléments du tableau json

PHPz
PHPzavant
2024-02-10 18:50:08410parcourir

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"}

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]"]}';

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)).

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

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
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer