欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫(kù)操作示例詳解

 更新時(shí)間:2022年12月29日 10:21:55   作者:程序員湯湯  
這篇文章主要為大家介紹了實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫(kù)操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

很多人都是從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)文章!

相關(guān)文章

  • golang并發(fā)安全及讀寫互斥鎖的示例分析

    golang并發(fā)安全及讀寫互斥鎖的示例分析

    這篇文章主要為大家介紹了golang并發(fā)安全及讀寫互斥鎖的示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 詳解Golang?Map中的key為什么是無序的

    詳解Golang?Map中的key為什么是無序的

    本文主要介紹了Golang?Map中的key為什么是無序的,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 解決golang 關(guān)于全局變量的坑

    解決golang 關(guān)于全局變量的坑

    這篇文章主要介紹了解決golang 關(guān)于全局變量的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang中常見加密算法的總結(jié)

    Golang中常見加密算法的總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Golang中常見的一些加密算法的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • Golang使用Apache PLC4X連接modbus的示例代碼

    Golang使用Apache PLC4X連接modbus的示例代碼

    Modbus是一種串行通信協(xié)議,是Modicon公司于1979年為使用可編程邏輯控制器(PLC)通信而發(fā)表,這篇文章主要介紹了Golang使用Apache PLC4X連接modbus的示例代碼,需要的朋友可以參考下
    2024-07-07
  • golang連接MongoDB數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)操作指南

    golang連接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í)間

    提升編程技能:學(xué)習(xí)如何在Go語言中正確格式化時(shí)間

    想知道如何在Go語言中輕松地格式化時(shí)間嗎?別再浪費(fèi)時(shí)間了!本文將帶你快速入門,讓你的代碼更加優(yōu)雅高效,快來學(xué)習(xí)吧!
    2024-01-01
  • golang使用net/rpc庫(kù)實(shí)現(xiàn)rpc

    golang使用net/rpc庫(kù)實(shí)現(xiàn)rpc

    這篇文章主要為大家詳細(xì)介紹了golang如何使用net/rpc庫(kù)實(shí)現(xiàn)rpc,文章的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下
    2024-01-01
  • Go語言實(shí)現(xiàn)定時(shí)器的方法

    Go語言實(shí)現(xiàn)定時(shí)器的方法

    這篇文章主要介紹了Go語言實(shí)現(xiàn)定時(shí)器的方法,涉及Go語言時(shí)間操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • golang中context使用小結(jié)

    golang中context使用小結(jié)

    本文主要介紹了golang中context使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11

最新評(píng)論