Java轉Go日記(三十九):Gorm查詢

1.1.1. 查詢

    // 獲取第一條記錄,按主鍵排序db.First(&user)SELECT * FROM users ORDER BY id LIMIT 1;// 獲取最后一條記錄,按主鍵排序db.Last(&user)SELECT * FROM users ORDER BY id DESC LIMIT 1;// 獲取所有記錄db.Find(&users)SELECT * FROM users;// 使用主鍵獲取記錄db.First(&user, 10)SELECT * FROM users WHERE id = 10;

1.1.2. Where查詢條件 (簡單SQL)

    // 獲取第一個匹配記錄db.Where("name = ?", "jinzhu").First(&user)SELECT * FROM users WHERE name = 'jinzhu' limit 1;// 獲取所有匹配記錄db.Where("name = ?", "jinzhu").Find(&users)SELECT * FROM users WHERE name = 'jinzhu';db.Where("name <> ?", "jinzhu").Find(&users)// INdb.Where("name in (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)// LIKEdb.Where("name LIKE ?", "%jin%").Find(&users)// ANDdb.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)// Timedb.Where("updated_at > ?", lastWeek).Find(&users)db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)

1.1.3. Where查詢條件 (Struct & Map)

注意:當使用struct查詢時,GORM將只查詢那些具有值的字段

    // Structdb.Where(&User{Name: "jinzhu", Age: 20}).First(&user)SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;// Mapdb.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users)SELECT * FROM users WHERE name = "jinzhu" AND age = 20;// 主鍵的Slicedb.Where([]int64{20, 21, 22}).Find(&users)SELECT * FROM users WHERE id IN (20, 21, 22);

1.1.4. Not條件查詢

    db.Not("name", "jinzhu").First(&user)SELECT * FROM users WHERE name <> "jinzhu" LIMIT 1;// Not Indb.Not("name", []string{"jinzhu", "jinzhu 2"}).Find(&users)SELECT * FROM users WHERE name NOT IN ("jinzhu", "jinzhu 2");// Not In slice of primary keysdb.Not([]int64{1,2,3}).First(&user)SELECT * FROM users WHERE id NOT IN (1,2,3);db.Not([]int64{}).First(&user)SELECT * FROM users;// Plain SQLdb.Not("name = ?", "jinzhu").First(&user)SELECT * FROM users WHERE NOT(name = "jinzhu");// Structdb.Not(User{Name: "jinzhu"}).First(&user)SELECT * FROM users WHERE name <> "jinzhu";

1.1.5. 帶內聯條件的查詢

注意:使用主鍵查詢時,應仔細檢查所傳遞的值是否為有效主鍵,以避免SQL注入

    // 按主鍵獲取db.First(&user, 23)SELECT * FROM users WHERE id = 23 LIMIT 1;// 簡單SQLdb.Find(&user, "name = ?", "jinzhu")SELECT * FROM users WHERE name = "jinzhu";db.Find(&users, "name <> ? AND age > ?", "jinzhu", 20)SELECT * FROM users WHERE name <> "jinzhu" AND age > 20;// Structdb.Find(&users, User{Age: 20})SELECT * FROM users WHERE age = 20;// Mapdb.Find(&users, map[string]interface{}{"age": 20})SELECT * FROM users WHERE age = 20;

1.1.6. Or條件查詢

    db.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&users)SELECT * FROM users WHERE role = 'admin' OR role = 'super_admin';// Structdb.Where("name = 'jinzhu'").Or(User{Name: "jinzhu 2"}).Find(&users)SELECT * FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2';// Mapdb.Where("name = 'jinzhu'").Or(map[string]interface{}{"name": "jinzhu 2"}).Find(&users)

1.1.7. 查詢鏈

Gorm有一個可鏈接的API,你可以這樣使用它

    db.Where("name <> ?","jinzhu").Where("age >= ? and role <> ?",20,"admin").Find(&users)SELECT * FROM users WHERE name <> 'jinzhu' AND age >= 20 AND role <> 'admin';db.Where("role = ?", "admin").Or("role = ?", "super_admin").Not("name = ?", "jinzhu").Find(&users)

1.1.8. 擴展查詢選項

    // 為Select語句添加擴展SQL選項db.Set("gorm:query_option", "FOR UPDATE").First(&user, 10)SELECT * FROM users WHERE id = 10 FOR UPDATE;

1.1.9. FirstOrInit

獲取第一個匹配的記錄,或者使用給定的條件初始化一個新的記錄(僅適用于struct,map條件)

    // Unfounddb.FirstOrInit(&user, User{Name: "non_existing"})user -> User{Name: "non_existing"}// Founddb.Where(User{Name: "Jinzhu"}).FirstOrInit(&user)user -> User{Id: 111, Name: "Jinzhu", Age: 20}db.FirstOrInit(&user, map[string]interface{}{"name": "jinzhu"})user -> User{Id: 111, Name: "Jinzhu", Age: 20}

1.1.10. Attrs

如果未找到記錄,則使用參數初始化結構

    // Unfounddb.Where(User{Name: "non_existing"}).Attrs(User{Age: 20}).FirstOrInit(&user)SELECT * FROM USERS WHERE name = 'non_existing';user -> User{Name: "non_existing", Age: 20}db.Where(User{Name: "non_existing"}).Attrs("age", 20).FirstOrInit(&user)SELECT * FROM USERS WHERE name = 'non_existing';user -> User{Name: "non_existing", Age: 20}// Founddb.Where(User{Name: "Jinzhu"}).Attrs(User{Age: 30}).FirstOrInit(&user)SELECT * FROM USERS WHERE name = jinzhu';user -> User{Id: 111, Name: "Jinzhu", Age: 20}

1.1.11. Assign

將參數分配給結果,不管它是否被找到

    db.Where(User{Name: "non_existing"}).Assign(User{Age: 20}).FirstOrInit(&user)user -> User{Name: "non_existing", Age: 20}// Founddb.Where(User{Name: "Jinzhu"}).Assign(User{Age: 30}).FirstOrInit(&user)SELECT * FROM USERS WHERE name = jinzhu';user -> User{Id: 111, Name: "Jinzhu", Age: 30}

1.1.12. FirstOrCreate

獲取第一個匹配的記錄,或創建一個具有給定條件的新記錄(僅適用于struct, map條件)

    // Unfounddb.FirstOrCreate(&user, User{Name: "non_existing"})INSERT INTO "users" (name) VALUES ("non_existing");user -> User{Id: 112, Name: "non_existing"}// Founddb.Where(User{Name: "Jinzhu"}).FirstOrCreate(&user)user -> User{Id: 111, Name: "Jinzhu"}

1.1.13. Attrs

如果未找到記錄,則為參數分配結構

    // Unfounddb.Where(User{Name: "non_existing"}).Attrs(User{Age: 20}).FirstOrCreate(&user)SELECT * FROM users WHERE name = 'non_existing';INSERT INTO "users" (name, age) VALUES ("non_existing", 20);user -> User{Id: 112, Name: "non_existing", Age: 20}// Founddb.Where(User{Name: "jinzhu"}).Attrs(User{Age: 30}).FirstOrCreate(&user)SELECT * FROM users WHERE name = 'jinzhu';user -> User{Id: 111, Name: "jinzhu", Age: 20}

1.1.14. Assign

將其分配給記錄,而不管它是否被找到,并保存回數據庫。

    // Unfounddb.Where(User{Name: "non_existing"}).Assign(User{Age: 20}).FirstOrCreate(&user)SELECT * FROM users WHERE name = 'non_existing';INSERT INTO "users" (name, age) VALUES ("non_existing", 20);user -> User{Id: 112, Name: "non_existing", Age: 20}// Founddb.Where(User{Name: "jinzhu"}).Assign(User{Age: 30}).FirstOrCreate(&user)SELECT * FROM users WHERE name = 'jinzhu';UPDATE users SET age=30 WHERE id = 111;user -> User{Id: 111, Name: "jinzhu", Age: 30}

1.1.15. Select

指定要從數據庫檢索的字段,默認情況下,將選擇所有字段;

    db.Select("name, age").Find(&users)SELECT name, age FROM users;db.Select([]string{"name", "age"}).Find(&users)SELECT name, age FROM users;db.Table("users").Select("COALESCE(age,?)", 42).Rows()SELECT COALESCE(age,'42') FROM users;

1.1.16. Order

在從數據庫檢索記錄時指定順序,將重排序設置為true以覆蓋定義的條件

    db.Order("age desc, name").Find(&users)SELECT * FROM users ORDER BY age desc, name;// Multiple ordersdb.Order("age desc").Order("name").Find(&users)SELECT * FROM users ORDER BY age desc, name;// ReOrderdb.Order("age desc").Find(&users1).Order("age", true).Find(&users2)SELECT * FROM users ORDER BY age desc; (users1)SELECT * FROM users ORDER BY age; (users2)

1.1.17. Limit

指定要檢索的記錄數

    db.Limit(3).Find(&users)SELECT * FROM users LIMIT 3;// Cancel limit condition with -1db.Limit(10).Find(&users1).Limit(-1).Find(&users2)SELECT * FROM users LIMIT 10; (users1)SELECT * FROM users; (users2)

1.1.18. Offset

指定在開始返回記錄之前要跳過的記錄數

    db.Offset(3).Find(&users)SELECT * FROM users OFFSET 3;// Cancel offset condition with -1db.Offset(10).Find(&users1).Offset(-1).Find(&users2)SELECT * FROM users OFFSET 10; (users1)SELECT * FROM users; (users2)

1.1.19. 18. Count

獲取模型的記錄數

    db.Where("name = ?", "jinzhu").Or("name = ?", "jinzhu 2").Find(&users).Count(&count)SELECT * from USERS WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (users)SELECT count(*) FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (count)db.Model(&User{}).Where("name = ?", "jinzhu").Count(&count)SELECT count(*) FROM users WHERE name = 'jinzhu'; (count)db.Table("deleted_users").Count(&count)SELECT count(*) FROM deleted_users;

1.1.20. Group & Having

    rows, err := db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Rows()for rows.Next() {...}rows, err := db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Having("sum(amount) > ?", 100).Rows()for rows.Next() {...}type Result struct {Date  time.TimeTotal int64}db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Having("sum(amount) > ?", 100).Scan(&results)

1.1.21. Join

指定連接條件

    rows, err := db.Table("users").Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Rows()for rows.Next() {...}db.Table("users").Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Scan(&results)// 多個連接與參數db.Joins("JOIN emails ON emails.user_id = users.id AND emails.email = ?", "jinzhu@example.org").Joins("JOIN credit_cards ON credit_cards.user_id = users.id").Where("credit_cards.number = ?", "411111111111").Find(&user)

1.1.22. Pluck

將模型中的單個列作為地圖查詢,如果要查詢多個列,可以使用Scan

    var ages []int64db.Find(&users).Pluck("age", &ages)var names []stringdb.Model(&User{}).Pluck("name", &names)db.Table("deleted_users").Pluck("name", &names)// 要返回多個列,做這樣:db.Select("name, age").Find(&users)

1.1.23. Scan

將結果掃描到另一個結構中。

    type Result struct {Name stringAge  int}var result Resultdb.Table("users").Select("name, age").Where("name = ?", 3).Scan(&result)// Raw SQLdb.Raw("SELECT name, age FROM users WHERE name = ?", 3).Scan(&result)

1.1.24. Scopes

將當前數據庫連接傳遞到func(*DB) *DB,可以用于動態添加條件

    func AmountGreaterThan1000(db *gorm.DB) *gorm.DB {return db.Where("amount > ?", 1000)}func PaidWithCreditCard(db *gorm.DB) *gorm.DB {return db.Where("pay_mode_sign = ?", "C")}func PaidWithCod(db *gorm.DB) *gorm.DB {return db.Where("pay_mode_sign = ?", "C")}func OrderStatus(status []string) func (db *gorm.DB) *gorm.DB {return func (db *gorm.DB) *gorm.DB {return db.Scopes(AmountGreaterThan1000).Where("status in (?)", status)}}db.Scopes(AmountGreaterThan1000, PaidWithCreditCard).Find(&orders)// 查找所有信用卡訂單和金額大于1000db.Scopes(AmountGreaterThan1000, PaidWithCod).Find(&orders)// 查找所有COD訂單和金額大于1000db.Scopes(OrderStatus([]string{"paid", "shipped"})).Find(&orders)// 查找所有付費,發貨訂單

1.1.25. 指定表名

    // 使用User結構定義創建`deleted_users`表db.Table("deleted_users").CreateTable(&User{})var deleted_users []Userdb.Table("deleted_users").Find(&deleted_users)SELECT * FROM deleted_users;db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()DELETE FROM deleted_users WHERE name = 'jinzhu';

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81754.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

bisheng系列(二)- 本地部署(前后端)

一、導讀 環境&#xff1a;Ubuntu 24.04、open Euler 23.03、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1 背景&#xff1a;需要bisheng二開商用&#xff0c;故而此處進行本地部署&#xff0c;便于后期調試開發 時間&#xff1a;20250519 說明&#xff1a;bisheng前后…

5G金融互聯:邁向未來金融服務的極速與智能新時代

5G金融互聯:邁向未來金融服務的極速與智能新時代 大家好,我是Echo_Wish,今天咱們聊聊一個大家都十分關心的話題:5G網絡在金融服務中的應用。咱們平時可能覺得5G只是打個電話、刷個視頻更流暢了,但在金融服務領域,5G的低延時、大帶寬和高可靠性正在悄然改變整個游戲規則。…

UE5 GAS框架解析內部數據處理機制——服務器與客戶端

當&#xff0c; gas通過點擊鼠標光標觸發事件時&#xff0c;內部的處理機制。 當通過點擊事件&#xff0c;命中中目標時&#xff0c; 可獲取到對應的TargetData 目標數據。處理相應的操作。 僅有本地的客戶端的情況下。命中并不會有什么異常。 當存在服務器時&#xff0c; 服…

Golang的Web應用架構設計

# Golang的Web應用架構設計 介紹 是一種快速、高效、可靠的編程語言&#xff0c;它在Web應用開發中越來越受歡迎。Golang的Web應用架構設計通常包括前端、后端和數據庫三個部分。在本篇文章中&#xff0c;我們將詳細介紹Golang的Web應用架構設計及其組成部分。 前端 在Golang的…

對比 HTTP-REST 與 gRPC:各自的優缺點以及適用的場景

文章目錄 對比 HTTP-REST 與 gRPC&#xff1a;各自的優缺點以及適用的場景HTTP-REST 與 gRPC 的核心區別gRPC 的優缺點HTTP-REST 的優缺點適用場景 模糊點什么是 Protobuf&#xff1f;HTTP/2 會將 HTTP 消息拆分并封裝為二進制幀&#xff0c;那還能過使用 HTTP/2 構建 RESTful …

現代健康生活養生指南

現代社會中&#xff0c;熬夜加班、久坐不動、飲食不規律成為許多人的生活常態&#xff0c;由此引發的健康問題也日益增多。想要擺脫亞健康&#xff0c;不必依賴中醫理念&#xff0c;從以下這些現代科學養生方法入手&#xff0c;就能逐步改善身體狀況。? 飲食上&#xff0c;注…

Go語言數組的定義與操作 - 《Go語言實戰指南》

在 Go 語言中&#xff0c;數組&#xff08;Array&#xff09; 是一種定長、同類型的集合。它在內存中是連續分布的&#xff0c;適合用于性能敏感的場景。 一、數組的定義 數組的基本語法如下&#xff1a; var 數組名 [長度]元素類型 示例&#xff1a; var nums [5]int …

Helm Chart 中配置多個 Docker Registry 地址以實現備用訪問

在 Helm Chart 中配置多個 Docker Registry 地址以實現備用訪問&#xff0c;可以通過以下幾種方式實現&#xff1a; 1. 在 values.yaml 中定義多個 Registry 在 values.yaml 中定義主 Registry 和備用 Registry&#xff0c;以便在部署時靈活切換&#xff1a; # values.yaml …

云原生安全:錯誤策略S3存儲桶ACL設置為Everyone:FullControl

??「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 ——從基礎到實踐的深度解析 1. 基礎概念 S3存儲桶與ACL Amazon S3(Simple Storage Service)是AWS提供的對象存儲服務,支持存儲和檢索任意規模的數據。ACL(訪問控制列表…

.NET 8 kestrel 配置PEM,實現內網https

一、生成證書 mkcert 是一個簡單的工具&#xff0c;用于制作本地信任的開發證書。它不需要配置。 mkcert官方倉庫地址&#xff1a;GitHub - FiloSottile/mkcert: A simple zero-config tool to make locally trusted development certificates with any names youd like. 簡…

nodejs快速入門到精通1

參考 nodejs快速入門到精通 菜鳥教程-nodejs nodejs官方文檔 原因 視頻免費 資料收費 筆記還是自己寫吧 安裝 nodejs官網 windows下&#xff1a; #查看nodejs版本 node -v #查看npm版本 npm -v #設置npm為淘寶鏡像源 npm config set registry https://registry.npmmirror.…

nginx負載均衡及keepalive高可用

實驗前期準備&#xff1a; 5臺虛擬機&#xff1a;4臺當做服務器&#xff0c;1臺當做客戶機&#xff08;當然&#xff0c;也可以使用主機的瀏覽器&#xff09;&#xff0c;4臺服務器中&#xff0c;2臺服務器當做后端真實訪問服務器&#xff1b;另外2臺服務器當做負載均衡服務器…

go語法大賞

前些日子單機房穩定性下降&#xff0c;找了好一會才找到真正的原因。這里面涉及到不少go語法細節&#xff0c;正好大家一起看一下。 一、仿真代碼 這是仿真之后的代碼 package mainimport ("fmt""go.uber.org/atomic""time" )type StopSignal…

Android 14 解決打開app出現不兼容彈窗的問題

應用安裝到 Android 14 上&#xff0c;出現如下提示 This app isn’t compatible with the latest version of Android. Check for an update or contact the app’s developer. 通過源碼找原因。 提示的字符 根據字符找到 ./frameworks/base/core/res/res/values/strings.xm…

Linux句柄數過多問題排查

以下是Linux句柄數過多問題的排查與解決方法整理&#xff1a; 一、檢測句柄使用情況 1?.查看系統限制? 單個進程限制&#xff1a;ulimit -n 系統級總限制&#xff1a;cat /proc/sys/fs/file-max 2?.統計進程占用量? 查看指定進程&#xff1a;lsof -p <PID> | wc -…

matlab插值方法(簡短)

在MATLAB中&#xff0c;可以使用interp1函數快速實現插值。以下代碼展示了如何使用spline插值方法對給定數據進行插值&#xff1a; x1 [23,56]; y1 [23,56]; X 23:1:56*4; Y interp1(x1,y1,X,spline);% linear、 spline其中&#xff0c;x1和y1是已知數據點&#xff0c;X是…

時間篩掉了不夠堅定的東西

2025年5月17日&#xff0c;16~25℃&#xff0c;還好 待辦&#xff1a; 《高等數學1》重修考試 《高等數學2》備課 《物理[2]》備課 《高等數學2》取消考試資格學生名單 《物理[2]》取消考試資格名單 職稱申報材料 2024年稅務申報 5月24日、25日監考報名 遇見&#xff1a;敲了一…

hexo博客搭建使用

搭建 Hexo 演示主題為&#xff1a;Keep 使用 文章 創建新文章 ? zymore-blog-keep git:(main) ? hexo new "告別H5嵌入&#xff01;uniApp小程序文件下載與分享完整解決方案" INFO Validating config INFO Created: ~/Desktop/HelloWorld/zymore-blog-k…

React組件開發流程-03.1

此章先以一個完整的例子來全面了解下React組件開發的流程&#xff0c;主要是以代碼為主&#xff0c;在不同的章節中會把重點標出來&#xff0c;要完成的例子如下&#xff0c;也可從官網中找到。 React組件開發流程 這只是一個通用流程&#xff0c;在熟悉后不需要完全遵從。 …

Cloudflare防火墻攔截谷歌爬蟲|導致收錄失敗怎么解決?

許多站長發現網站突然從谷歌搜索結果中“消失”&#xff0c;背后很可能是Cloudflare防火墻誤攔截了谷歌爬蟲&#xff08;Googlebot&#xff09;&#xff0c;導致搜索引擎無法正常抓取頁面。 由于Cloudflare默認的防護規則較為嚴格&#xff0c;尤其是針對高頻訪問的爬蟲IP&…