萬萬沒想到,go的數據庫操作,也能像php一樣溜了

語言: CN / TW / HK

Hi,各位go的小夥伴。

很多人都是從php轉過來的吧,不知道你們有沒有發現,go界的orm並沒有像php的orm一樣好用。這篇文章裏,我們認真的討論下這個問題,並且會在後面提出解決方案。

微信圖片_20221226163624.png

php的方便

比如你想實現一個關聯查詢,在php裏,你只需要不斷的使用箭頭函數就可以了。

php $users = DB::table('users')->whereIn('id', [1, 2, 3])->orderBy('name', 'desc')->get(); 以上代碼,很簡單實現了對一個表的查詢操作,並且將查詢結果以name做倒序排列,很簡單

但是做同樣的工作,在go裏面就比較麻煩了

go的麻煩

如果你使用go的原生查詢的話,你需要寫如下的代碼 go rows, err := db.Query("select * from users where id in (?,?,?) order by name desc", 1, 2, 3) 基本上説,你需要手寫一個完整的sql語句,全手動

什麼!手寫sql語句,不是咱不會寫,關鍵是沒必要手寫啊,是吧。

全手寫可能帶來兩個問題 1. 某些同學對於sql語法可能不熟悉,容易有語法錯誤
2. 某些同學可能寫sql不認真,容易有拼寫錯誤,尤其是條件多,佔位符多的時候

如果你使用gorm之類的orm工具,可能會這樣寫 go db.Where("id in (?)", []int{1,2,3}).Order("create_time desc").Find(&users)

很顯然對比原生的來説,好一些,不用手寫select 等關鍵字了,但是核心問題還是沒解決,還需要手寫 id in (?) 之類的。相當於之前是全手工,現在是半手工半自動了。

我這個例子裏,條件就一個,在實際業務中,查詢條件會有很多,並且數量還不一定,這種半自動的方法還是不太好的。

解決方案

既然有問題,那就有解決方案。很明顯,最理想的方案就是保持與php的一致。那麼go能做到這樣嗎?

答案是毫無疑問的,可以的。

這裏推薦一個新的數據庫操作庫,可以很方便的完成這樣的工作

tangpanqing/aorm: Operate Database So Easy For GoLang Developer (github.com)

它有一些顯著的特性 -  代碼簡潔,高性能 -  支持 MySQL,MsSQL,Postgres,Sqlite3 數據庫 -  支持 空值查詢 -  支持 自動遷移 -  支持 SQL 拼接

我們來看具體使用,就剛才的操作 go aorm.Use(db).Table("users").WhereIn("id", []int{1,2,3}).OrderBy("name","desc").GetMany(&users) 對比php的寫法 php $users = DB::table('users')->whereIn('id', [1, 2, 3])->orderBy('name', 'desc')->get(); 不能説一模一樣吧,那簡直是一模一樣是不是?

我們再來看看如果是查詢條件不確定怎麼辦?

這是列表查詢經常遇到的問題,前端傳過來的數據數量是不一定的,我們需要根據不同的數據,來增加或者減少不同的條件,進而產生不同的sql,查詢不同的結果

```go 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])
}

``` 如上,你可以定義一個builder.WhereItem的切片(數組),然後根據前端傳過來的信息,來增加和減少這個數組裏的項,最後將這個查詢數組,傳遞給aorm進行最後查詢,最終得到結果。

由上面的例子可以看出,和PHP一樣,你只是需要輸入關鍵的字段名,關鍵的數據這就行了,其他的sql關鍵字,以及多種條件的拼接,aorm庫自動幫你完成了。完美解決語法錯誤問題,以及拼寫錯誤問題。

怎麼樣,香不香?

寫在最後

aorm庫非常的好用,為go工程師帶來了php一般的開發體驗,推薦各位快快用起來。

tangpanqing/aorm: Operate Database So Easy For GoLang Developer (github.com)

微信圖片_20221226163643.png