最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

引言

很多人都是從php轉(zhuǎn)過來的吧,不知道你們有沒有發(fā)現(xiàn),go界的orm并沒有像php的orm一樣好用。這篇文章里,我們認(rèn)真的討論下這個問題,并且會在后面提出解決方案。

php的方便

比如你想實(shí)現(xiàn)一個關(guān)聯(lián)查詢,在php里,你只需要不斷的使用箭頭函數(shù)就可以了。

$users = DB::table('users')->whereIn('id', [1, 2, 3])->orderBy('name', 'desc')->get();

以上代碼,很簡單實(shí)現(xiàn)了對一個表的查詢操作,并且將查詢結(jié)果以name做倒序排列,很簡單

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

go的麻煩

如果你使用go的原生查詢的話,你需要寫如下的代碼

rows, err := db.Query("select * from users where id in (?,?,?) order by name desc", 1, 2, 3)

基本上說,你需要手寫一個完整的sql語句,全手動

什么!手寫sql語句,不是咱不會寫,關(guān)鍵是沒必要手寫啊,是吧。

全手寫可能帶來兩個問題

  • 某些同學(xué)對于sql語法可能不熟悉,容易有語法錯誤
  • 某些同學(xué)可能寫sql不認(rèn)真,容易有拼寫錯誤,尤其是條件多,占位符多的時候

如果你使用gorm之類的orm工具,可能會這樣寫

db.Where("id in (?)", []int{1,2,3}).Order("create_time desc").Find(&users)

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

我這個例子里,條件就一個,在實(shí)際業(yè)務(wù)中,查詢條件會有很多,并且數(shù)量還不一定,這種半自動的方法還是不太好的。

解決方案

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

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

這里推薦一個新的數(shù)據(jù)庫操作庫,可以很方便的完成這樣的工作

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

它有一些顯著的特性

  •  代碼簡潔,高性能
  •  支持 MySQL,MsSQL,Postgres,Sqlite3 數(shù)據(jù)庫
  •  支持 空值查詢
  •  支持 自動遷移
  •  支持 SQL 拼接

我們來看具體使用,就剛才的操作

aorm.Use(db).Table("users").WhereIn("id", []int{1,2,3}).OrderBy("name","desc").GetMany(&users)

對比php的寫法

$users = DB::table('users')->whereIn('id', [1, 2, 3])->orderBy('name', 'desc')->get();

不能說一模一樣吧,那簡直是一模一樣是不是?

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

這是列表查詢經(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])
    }

如上,你可以定義一個builder.WhereItem的切片(數(shù)組),然后根據(jù)前端傳過來的信息,來增加和減少這個數(shù)組里的項(xiàng),最后將這個查詢數(shù)組,傳遞給aorm進(jìn)行最后查詢,最終得到結(jié)果。

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

怎么樣,香不香?

寫在最后

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

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

以上就是實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫操作示例詳解的詳細(xì)內(nèi)容,更多關(guān)于go ORM數(shù)據(jù)庫操作的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go 生成器模式的具體使用

    go 生成器模式的具體使用

    生成器是一種創(chuàng)建型設(shè)計模式,使你能夠分步驟創(chuàng)建復(fù)雜對象,本文主要介紹了go生成器模式的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 淺談Go語言的error類型

    淺談Go語言的error類型

    這篇文章主要介紹了淺談Go語言的error類型,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON

    Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON

    本文主要介紹了Go語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)JSON,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式

    Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式

    這篇文章主要介紹了Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • go?defer避坑指南之拆解延遲語句

    go?defer避坑指南之拆解延遲語句

    這篇文章主要為大家詳細(xì)介紹了go?defer避坑指南之如何拆解延遲語句,掌握正確使用方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • Golang內(nèi)存模型教科書級講解

    Golang內(nèi)存模型教科書級講解

    go官方介紹go內(nèi)存模型的時候說:探究在什么條件下,goroutine?在讀取一個變量的值的時,能夠看到其它?goroutine?對這個變量進(jìn)行的寫的結(jié)果,Go內(nèi)存模型規(guī)定了一些條件,在這些條件下,在一個goroutine中讀取變量返回的值能夠確保是另一個goroutine中對該變量寫入的值
    2023-03-03
  • Go語言將string解析為time.Time時兩種常見報錯

    Go語言將string解析為time.Time時兩種常見報錯

    本文主要介紹了Go語言將string解析為time.Time時兩種常見報錯,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang監(jiān)聽日志文件并發(fā)送到kafka中

    Golang監(jiān)聽日志文件并發(fā)送到kafka中

    這篇文章主要介紹了Golang監(jiān)聽日志文件并發(fā)送到kafka中,日志收集項(xiàng)目的準(zhǔn)備中,本文主要講的是利用golang的tail庫,監(jiān)聽日志文件的變動,將日志信息發(fā)送到kafka中?,需要的朋友可以參考一下
    2022-04-04
  • 簡單講解Go程序中使用MySQL的方法

    簡單講解Go程序中使用MySQL的方法

    這篇文章主要介紹了Go程序中使用MySQL的方法,需要使用第三方包來進(jìn)行連接,需要的朋友可以參考下
    2015-10-10
  • Golang實(shí)現(xiàn)自己的Redis(TCP篇)實(shí)例探究

    Golang實(shí)現(xiàn)自己的Redis(TCP篇)實(shí)例探究

    這篇文章主要介紹了Golang實(shí)現(xiàn)自己的Redis(TCP篇)實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01

最新評論

大姚县| 司法| 象州县| 论坛| 雷波县| 贺兰县| 恭城| 上高县| 昌吉市| 黔江区| 台中县| 正阳县| 凤翔县| 灵丘县| 安泽县| 东方市| 兴义市| 海盐县| 封丘县| 新丰县| 新蔡县| 铜陵市| 浮山县| 秭归县| 鄄城县| 大安市| 海晏县| 东阳市| 海口市| 堆龙德庆县| 沾益县| 嘉荫县| 正宁县| 通化市| 阳春市| 金山区| 巴马| 高邮市| 靖西县| 略阳县| 巴林右旗|