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!
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.
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 protected]</a>", "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="bccececefcdedede92dfdf">[email protected]</a>", "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="5d2929291d3e3e3e732727">[email protected]</a>" ], "mail_folder": "some_folder" }'), ('zzz', '{ "email": [ "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="0e7474744e6d6d6d206d6d">[email protected]</a>", "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="b3d2d2d2f3d1d1d19dd0d0">[email protected]</a>", "<a href="https://www.php.cn/link/89fee0513b6668e555959f5dc23238e9" class="__cf_email__" data-cfemail="a7c5c5c5e7c4c4c489dddd">[email 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 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!