GoFrame框架ORM原生方法對(duì)象操作開(kāi)箱體驗(yàn)
前言
最近一直在用GoFrame(下文簡(jiǎn)稱gf)來(lái)開(kāi)發(fā)項(xiàng)目,在熟悉業(yè)務(wù)邏輯之后就是馬不停蹄的擼代碼了。
之前整理過(guò)結(jié)構(gòu)體和json轉(zhuǎn)換的文章:GoFrame必知必會(huì)之Scan:類型轉(zhuǎn)換,今天整理同樣比較重要的ORM相關(guān)的文章。
gf是支持ORM原生操作的,在ORM鏈?zhǔn)讲僮鲌?zhí)行不了太過(guò)于復(fù)雜的SQL操作時(shí),可以交給方法操作來(lái)處理。
上一篇文章 整理了ORM的原生方法,這篇文章根據(jù)整理的原生方法整理對(duì)應(yīng)的開(kāi)箱體驗(yàn)。
開(kāi)箱體驗(yàn)
1. ORM對(duì)象
// 獲取默認(rèn)配置的數(shù)據(jù)庫(kù)對(duì)象(配置名稱為"default")
db := g.DB()
// 獲取配置分組名稱為"user"的數(shù)據(jù)庫(kù)對(duì)象
db := g.DB("user")
// 使用原生單例管理方法獲取數(shù)據(jù)庫(kù)對(duì)象單例
db, err := gdb.Instance()
db, err := gdb.Instance("user")
tips
不用的時(shí)候不需要使用Close方法關(guān)閉數(shù)據(jù)庫(kù)連接,數(shù)據(jù)庫(kù)引擎底層采用了鏈接池設(shè)計(jì),當(dāng)鏈接不再使用時(shí)會(huì)自動(dòng)關(guān)閉
2. 數(shù)據(jù)寫(xiě)入
r, err := db.Insert(ctx, "user", gdb.Map {
"name": "王中陽(yáng)",
})
3. 數(shù)據(jù)查詢(單條)
雖然limit 10,但是因?yàn)槲覀兪褂玫氖荊etOne,仍然只會(huì)返回單條數(shù)據(jù)
one, err := db.GetOne(ctx, "select * from user limit 10")
one, err := db.GetOne(ctx, "select * from user where id=100")
one, err := db.GetOne(ctx, "select * from user where id=?", 100)
one, err := db.GetOne(ctx, "select * from user where id=?", g.Slice{100})
4. 數(shù)據(jù)查詢(列表)
list, err := db.GetAll(ctx, "select * from user limit 10")
list, err := db.GetAll(ctx, "select * from user where age > ? and name like ?", g.Slice{20, "%金%"})
list, err := db.GetAll(ctx, "select * from user where status=?", g.Slice{1})
5. 數(shù)據(jù)保存
數(shù)據(jù)保存是Save,插入數(shù)據(jù)是insert,區(qū)別是是否指定主鍵
r, err := db.Save(ctx, "user", gdb.Map {
"id" : 1,
"name" : "王中陽(yáng)",
})
6. 批量操作
batch := 10
_, err := db.Insert(ctx, "user", gdb.List {
{"name": "小明"},
{"name": "小華"},
{"name": "小軍"},
{"name": "小高"},
}, batch)
tips
- 其中batch參數(shù)用于指定批量操作中分批寫(xiě)入條數(shù)數(shù)量(默認(rèn)是10)。
- 表示批量寫(xiě)入數(shù)據(jù)時(shí)的每批次數(shù)量,這個(gè)數(shù)值跟你數(shù)據(jù)庫(kù)服務(wù)器配置的SQL BufferSize數(shù)值有關(guān)。
7. 數(shù)據(jù)更新/刪除
// db.Update/db.Delete 同理
// UPDATE `user` SET `name`='王中陽(yáng)' WHERE `id`=10000
r, err := db.Update(ctx, "user", gdb.Map {"name": "王中陽(yáng)"}, "id=?", 10000)
// UPDATE `user` SET `name`='王中陽(yáng)' WHERE `id`=10000
r, err := db.Update(ctx, "user", "name='王中陽(yáng)'", "id=10000")
// UPDATE `user` SET `name`='王中陽(yáng)' WHERE `id`=10000
r, err := db.Update(ctx, "user", "name=?", "id=?", "王中陽(yáng)", 10000)
tips
參數(shù)建議使用?占位符進(jìn)行輸入,避免SQL注入風(fēng)險(xiǎn)。
總結(jié)
雖然GoFrame的ORM鏈?zhǔn)讲僮鞣浅:?jiǎn)單且強(qiáng)大,但是業(yè)務(wù)中總還是有一些邏輯需要使用原生方法實(shí)現(xiàn),化繁為簡(jiǎn)。
以上就是GoFrame框架ORM原生方法對(duì)象操作開(kāi)箱體驗(yàn)的詳細(xì)內(nèi)容,更多關(guān)于GoFrame ORM原生方法對(duì)象操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何通過(guò)Golang的container/list實(shí)現(xiàn)LRU緩存算法
文章介紹了Go語(yǔ)言中container/list包實(shí)現(xiàn)的雙向鏈表,并探討了如何使用鏈表實(shí)現(xiàn)LRU緩存,LRU緩存通過(guò)維護(hù)一個(gè)雙向鏈表來(lái)管理數(shù)據(jù),確保在插入和刪除操作時(shí)能夠以O(shè)(1)的平均時(shí)間復(fù)雜度運(yùn)行,提供了鏈表的操作和使用場(chǎng)景,并附帶了實(shí)現(xiàn)LRU緩存的代碼示例,感興趣的朋友一起看看吧2025-03-03
Golang導(dǎo)入包的幾種方式(點(diǎn),別名與下劃線)
這篇文章主要介紹了Golang導(dǎo)入包的幾種方式(點(diǎn),別名與下劃線),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Golang實(shí)現(xiàn)四層負(fù)載均衡的示例代碼
做開(kāi)發(fā)的同學(xué)應(yīng)該經(jīng)常聽(tīng)到過(guò)負(fù)載均衡的概念,今天我們就來(lái)實(shí)現(xiàn)一個(gè)乞丐版的四層負(fù)載均衡,并用它對(duì)mysql進(jìn)行負(fù)載均衡測(cè)試,感興趣的可以了解一下2023-07-07
go實(shí)現(xiàn)整型的二進(jìn)制轉(zhuǎn)化的方法
這篇文章主要介紹了go實(shí)現(xiàn)整型的二進(jìn)制轉(zhuǎn)化的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07
golang struct 實(shí)現(xiàn) interface的方法
這篇文章主要介紹了golang struct 實(shí)現(xiàn) interface的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07

