gorm postgres 查詢 json 陣列中的元素是一個常見的需求,特別是在處理複雜的資料結構時。在使用 GORM 進行資料庫查詢時,我們可以透過一些技巧來實現這個目標。在本文中,我們將向您展示如何使用 GORM 和 Postgres 資料庫來查詢 json 陣列中的元素。無論您是初學者還是有經驗的開發者,本文都將為您提供詳細的指導,以幫助您輕鬆解決這個問題。讓我們開始吧!
在我的 golang 專案中,我將 postgres 與 gorm 結合使用,並且有一個包含以下 json 的屬性列:
{"email": ["[email protected]", "[email protected]", "[email protected]"], "mail_folder": "some_folder"} {"email": ["[email protected]", "[email protected]", "[email protected]"], "mail_folder": "some_folder"}
所以我需要取得包含電子郵件 [email protected]
的記錄,這是第一筆記錄。我可以使用以下查詢在 sql 編輯器中使用純 sql 來提取它:
select * from authors a where attributes @> '{"email": ["[email protected]"]}';
但在 gorm 中,我不斷收到錯誤的 json 語法錯誤等。我嘗試使用 raw() 查詢或使用
Where(fmt.Sprintf("attributes ->> 'email' = '[\"%v\"]'", email)).
但它也不起作用。任何如何修復它的想法都將受到歡迎。謝謝。
postgresql 中的 sampledb:
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" }');
這工作正常:
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 }
對於範例資料列印:
1 eee {{"email": ["[電子郵件受保護] ", "[電子郵件受保護]", "[電子郵件受保護]"], "mail_folder": "some_folder"}}
以上是gorm postgres 查詢 json 陣列中的元素的詳細內容。更多資訊請關注PHP中文網其他相關文章!