實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫(kù)操作示例詳解
引言
很多人都是從php轉(zhuǎn)過來的吧,不知道你們有沒有發(fā)現(xiàn),go界的orm并沒有像php的orm一樣好用。這篇文章里,我們認(rèn)真的討論下這個(gè)問題,并且會(huì)在后面提出解決方案。
php的方便
比如你想實(shí)現(xiàn)一個(gè)關(guān)聯(lián)查詢,在php里,你只需要不斷的使用箭頭函數(shù)就可以了。
$users = DB::table('users')->whereIn('id', [1, 2, 3])->orderBy('name', 'desc')->get();
以上代碼,很簡(jiǎn)單實(shí)現(xiàn)了對(duì)一個(gè)表的查詢操作,并且將查詢結(jié)果以name做倒序排列,很簡(jiǎn)單
但是做同樣的工作,在go里面就比較麻煩了
go的麻煩
如果你使用go的原生查詢的話,你需要寫如下的代碼
rows, err := db.Query("select * from users where id in (?,?,?) order by name desc", 1, 2, 3)
基本上說,你需要手寫一個(gè)完整的sql語句,全手動(dòng)
什么!手寫sql語句,不是咱不會(huì)寫,關(guān)鍵是沒必要手寫啊,是吧。
全手寫可能帶來兩個(gè)問題
- 某些同學(xué)對(duì)于sql語法可能不熟悉,容易有語法錯(cuò)誤
- 某些同學(xué)可能寫sql不認(rèn)真,容易有拼寫錯(cuò)誤,尤其是條件多,占位符多的時(shí)候
如果你使用gorm之類的orm工具,可能會(huì)這樣寫
db.Where("id in (?)", []int{1,2,3}).Order("create_time desc").Find(&users)
很顯然對(duì)比原生的來說,好一些,不用手寫select 等關(guān)鍵字了,但是核心問題還是沒解決,還需要手寫 id in (?) 之類的。相當(dāng)于之前是全手工,現(xiàn)在是半手工半自動(dòng)了。
我這個(gè)例子里,條件就一個(gè),在實(shí)際業(yè)務(wù)中,查詢條件會(huì)有很多,并且數(shù)量還不一定,這種半自動(dòng)的方法還是不太好的。
解決方案
既然有問題,那就有解決方案。很明顯,最理想的方案就是保持與php的一致。那么go能做到這樣嗎?
答案是毫無疑問的,可以的。
這里推薦一個(gè)新的數(shù)據(jù)庫(kù)操作庫(kù),可以很方便的完成這樣的工作
tangpanqing/aorm: Operate Database So Easy For GoLang Developer (github.com)
它有一些顯著的特性
- 代碼簡(jiǎn)潔,高性能
- 支持 MySQL,MsSQL,Postgres,Sqlite3 數(shù)據(jù)庫(kù)
- 支持 空值查詢
- 支持 自動(dòng)遷移
- 支持 SQL 拼接
我們來看具體使用,就剛才的操作
aorm.Use(db).Table("users").WhereIn("id", []int{1,2,3}).OrderBy("name","desc").GetMany(&users)
對(duì)比php的寫法
$users = DB::table('users')->whereIn('id', [1, 2, 3])->orderBy('name', 'desc')->get();
不能說一模一樣吧,那簡(jiǎn)直是一模一樣是不是?
我們?cè)賮砜纯慈绻遣樵儣l件不確定怎么辦?
這是列表查詢經(jīng)常遇到的問題,前端傳過來的數(shù)據(jù)數(shù)量是不一定的,我們需要根據(jù)不同的數(shù)據(jù),來增加或者減少不同的條件,進(jìn)而產(chǎn)生不同的sql,查詢不同的結(jié)果
var listByWhere []Person var where1 []builder.WhereItem where1 = append(where1, builder.WhereItem{Field: "type", Opt: builder.Eq, Val: 0}) where1 = append(where1, builder.WhereItem{Field: "age", Opt: builder.In, Val: []int{18, 20}}) where1 = append(where1, builder.WhereItem{Field: "money", Opt: builder.Between, Val: []float64{100.1, 200.9}}) where1 = append(where1, builder.WhereItem{Field: "money", Opt: builder.Eq, Val: 100.15}) where1 = append(where1, builder.WhereItem{Field: "name", Opt: builder.Like, Val: []string{"%", "li", "%"}}) aorm.Use(db).Debug(true).Table("person").WhereArr(where1).GetMany(&listByWhere) for i := 0; i < len(listByWhere); i++ { fmt.Println(listByWhere[i]) }
如上,你可以定義一個(gè)builder.WhereItem的切片(數(shù)組),然后根據(jù)前端傳過來的信息,來增加和減少這個(gè)數(shù)組里的項(xiàng),最后將這個(gè)查詢數(shù)組,傳遞給aorm進(jìn)行最后查詢,最終得到結(jié)果。
由上面的例子可以看出,和PHP一樣,你只是需要輸入關(guān)鍵的字段名,關(guān)鍵的數(shù)據(jù)這就行了,其他的sql關(guān)鍵字,以及多種條件的拼接,aorm庫(kù)自動(dòng)幫你完成了。完美解決語法錯(cuò)誤問題,以及拼寫錯(cuò)誤問題。
怎么樣,香不香?
寫在最后
aorm庫(kù)非常的好用,為go工程師帶來了php一般的開發(fā)體驗(yàn),推薦各位快快用起來。
tangpanqing/aorm: Operate Database So Easy For GoLang Developer (github.com)
以上就是實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫(kù)操作示例詳解的詳細(xì)內(nèi)容,更多關(guān)于go ORM數(shù)據(jù)庫(kù)操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Go語言MySQLCURD數(shù)據(jù)庫(kù)操作示例詳解
- Go操作mongodb數(shù)據(jù)庫(kù)方法示例
- golang?MySQL實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表存儲(chǔ)獲取操作示例
- Beego中ORM操作各類數(shù)據(jù)庫(kù)連接方式詳細(xì)示例
- golang?gorm框架數(shù)據(jù)庫(kù)的連接操作示例
- golang操作連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)mysql事務(wù)示例
- golang連接mysql數(shù)據(jù)庫(kù)操作使用示例
- Go連接數(shù)據(jù)庫(kù)操作基礎(chǔ)講解
相關(guān)文章
Golang使用Apache PLC4X連接modbus的示例代碼
Modbus是一種串行通信協(xié)議,是Modicon公司于1979年為使用可編程邏輯控制器(PLC)通信而發(fā)表,這篇文章主要介紹了Golang使用Apache PLC4X連接modbus的示例代碼,需要的朋友可以參考下2024-07-07golang連接MongoDB數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)操作指南
MongoDB是Nosql中常用的一種數(shù)據(jù)庫(kù),下面這篇文章主要給大家介紹了關(guān)于golang連接MongoDB數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)操作的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09提升編程技能:學(xué)習(xí)如何在Go語言中正確格式化時(shí)間
想知道如何在Go語言中輕松地格式化時(shí)間嗎?別再浪費(fèi)時(shí)間了!本文將帶你快速入門,讓你的代碼更加優(yōu)雅高效,快來學(xué)習(xí)吧!2024-01-01golang使用net/rpc庫(kù)實(shí)現(xiàn)rpc
這篇文章主要為大家詳細(xì)介紹了golang如何使用net/rpc庫(kù)實(shí)現(xiàn)rpc,文章的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下2024-01-01