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

Go使用XORM操作MySQL的陷阱盤點分析

 更新時間:2023年11月30日 11:26:58   作者:frank  
在?Go?語言開發(fā)中,大家為了方便,通常會選擇使用?ORM?操作數(shù)據(jù)庫,比如使用?XORM?或?GORM?操作?MySQL,本文我們來介紹一下使用?XORM[3]?操作?MySQL?可能會遇到的陷阱

使用 XORM 操作 MySQL 的陷阱

雖然使用 ORM 操作 MySQL 比直接使用標準庫 `sql`[1] 和三方 MySQL 數(shù)據(jù)庫驅動包[2]操作 MySQL 更加方便,但是也會遇到一些陷阱。

類型零值

在 Golang 中,每個數(shù)據(jù)類型都有各自的類型零值,比如 int 的零值是 0,string 的零值是 ''等。

示例代碼:

package main
import (
 "fmt"
 _ "github.com/go-sql-driver/mysql"
 "xorm.io/xorm"
)
func main() {
 // 創(chuàng)建 Engine
 engine, err := xorm.NewEngine("mysql", "root:root@/example?charset=utf8")
 defer func() {
  err = engine.Close()
  if err != nil {
   fmt.Printf("engine close err=%v\n", err)
   return
  }
 }()
 if err != nil {
  fmt.Printf("init xorm engine fail, err=%v\n", err)
  return
 }
 // 更新數(shù)據(jù)
 example := &Example{
  Title: "go",
  View:  0,
 }
 condi := &Example{
  Id: 2,
 }
 affected, err := engine.Update(example, condi)
 if err != nil {
  fmt.Printf("Update err=%v\n", err)
  return
 }
 fmt.Printf("affected=%d\n", affected)
}
type Example struct {
 Id      int    `json:"id" form:"id"`
 Title   string `json:"title" form:"title"`
 View    int    `json:"view" form:"view"`
 Created int    `json:"created" form:"created" xorm:"created"`
 Updated int    `json:"updated" form:"updated" xorm:"updated"`
}

閱讀上面這段代碼,我們可以發(fā)現(xiàn)示例代碼中將 id=2 的數(shù)據(jù) view 字段更新為 0,因為 0 是 int 的類型零值,XORM 的 Update 方法會自動忽略類型零值,所以該數(shù)據(jù) view 字段的值沒有更改。

但是,在實際項目開發(fā)中,我們可能需要將某個字段的值更新為該字段類型的類型零值,此時我們該怎么操作呢?

affected, err := engine.Cols("title", "view").Update(example, condi)

我們可以使用 Cols() 方法,指定需要更新的字段,這樣即便需要更新字段的值是該字段類型的類型零值,也可以正常更改。

提示:建議在設計數(shù)據(jù)庫表時,字段的值盡量使用非類型零值。

自增 id

在插入數(shù)據(jù)時,我們可能需要返回自增 id,我們先看一段代碼:

// 插入數(shù)據(jù)
example := &Example{
  Title: "PHP",
  View:  90,
}
affected, err := engine.Insert(example)
if err != nil {
  fmt.Printf("Insert err=%v\n", err)
  return
}
fmt.Printf("affected=%v\n", affected)

閱讀上面這段代碼,我們插入一條數(shù)據(jù),返回結果是影響行數(shù)和錯誤信息,而不是直接返回該條數(shù)據(jù)的自增 id。

可能有些讀者朋友們會接著使用查詢方法,查詢最新一條數(shù)據(jù)的 id,在并發(fā)請求數(shù)低的場景中,該方法是可以查到新插入數(shù)據(jù)的自增 id。

但是在并發(fā)請求數(shù)高的場景中,該方法查到的最新一條數(shù)據(jù)的 id,未必是我們剛插入的數(shù)據(jù)的自增 id。

id := example.Id
fmt.Printf("affected=%v || id=%d\n", affected, id)

閱讀上面這段代碼,我們想要獲取新插入數(shù)據(jù)的自增 id,直接 example.Id 即可獲取,但是前提條件是結構體中,id 字段使用 xorm:"autoincr" 標簽。

更新 created 字段

我們在結構體中,使用標簽 xorm:created 和 xorm:updated 即可自動插入當前時間。

但是,使用 xorm:created 標簽的字段,只有在第一次插入數(shù)據(jù)時寫入當前時間,此后將不再會更改;使用 xorm:updated 標簽的字段,在第一次插入數(shù)據(jù)時寫入當前時間,此后每次 Update 操作,時間都會更改。

如果我們的業(yè)務需求是需要更改使用 xorm:created 標簽的字段,可以做到嗎?

// 更改數(shù)據(jù)
example := &Example{
  Title: "JavaScript",
  View:  98,
}
condi := &Example{
  Id: 2,
}
affected, err := engine.Update(example, condi)
if err != nil {
  fmt.Printf("Update err=%v\n", err)
  return
}
fmt.Printf("affected=%d\n", affected)

閱讀上面這段代碼,我們發(fā)現(xiàn)執(zhí)行 Update 方法之后,使用 xorm:updated 標簽的字段的值被更改,而使用 xorm:created 標簽的字段的值沒被更改。

我們換一種更新數(shù)據(jù)的方式,代碼如下:

// 更改數(shù)據(jù)
sql := "UPDATE example SET title=?, view=?, created=? WHERE id=?"
res, err := engine.Exec(sql, "Python", 60, time.Now().Unix(), 2)
if err != nil {
  fmt.Printf("Update err=%v\n", err)
  return
}
affected, err := res.RowsAffected()
if err != nil {
  fmt.Printf("RowsAffected err=%v\n", err)
  return
}
fmt.Printf("affected=%d\n", affected)

閱讀上面這段代碼,我們可以發(fā)現(xiàn)使用 Exec 方法執(zhí)行原生 SQL 可以滿足我們的需求。

總結

本文我們介紹了使用 XORM 操作 MySQL 時,新手讀者朋友們可能會遇到的陷阱,希望可以給大家?guī)硪恍椭?,更多關于Go XORM操作MySQL的資料請關注腳本之家其它相關文章!

相關文章

  • go語言使用RocketMq的示例代碼

    go語言使用RocketMq的示例代碼

    這篇文章主要介紹了go語言使用RocketMq的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-01-01
  • Go語言操作Excel利器之excelize類庫詳解

    Go語言操作Excel利器之excelize類庫詳解

    Excelize是Go語言編寫的用于操作Office Excel文檔基礎庫,基于ECMA-376,ISO/IEC 29500國際標準,可以使用它來讀取、寫入由Excel 2007及以上版本創(chuàng)建的電子表格文檔,下面這篇文章主要給大家介紹了關于Go語言操作Excel利器之excelize類庫的相關資料,需要的朋友可以參考下
    2022-10-10
  • Go語言展現(xiàn)快速排序算法全過程的思路及代碼示例

    Go語言展現(xiàn)快速排序算法全過程的思路及代碼示例

    這篇文章主要介紹了Go語言展現(xiàn)快速排序算法全過程的思路及代碼示例,文章最后作者還提到了對Quick Sort算法優(yōu)化的一些想法,需要的朋友可以參考下
    2016-04-04
  • Go語言學習之運算符使用詳解

    Go語言學習之運算符使用詳解

    這篇文章主要介紹了Go語言中常用運算符的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Go defer 原理和源碼剖析(推薦)

    Go defer 原理和源碼剖析(推薦)

    這篇文章主要介紹了Go defer 原理和源碼剖析,需要的朋友可以參考下
    2021-11-11
  • go mutex互斥鎖使用Lock和Unlock方法占有釋放資源

    go mutex互斥鎖使用Lock和Unlock方法占有釋放資源

    Go號稱是為了高并發(fā)而生的,在高并發(fā)場景下,勢必會涉及到對公共資源的競爭,當對應場景發(fā)生時,我們經(jīng)常會使用 mutex 的 Lock() 和 Unlock() 方法來占有或釋放資源,雖然調用簡單,但 mutex 的內部卻涉及挺多的,本文來好好研究一下
    2023-09-09
  • GoLang channel使用介紹

    GoLang channel使用介紹

    Channel 和 goroutine 的結合是 Go 并發(fā)編程的大殺器。而 Channel 的實際應用也經(jīng)常讓人眼前一亮,通過與 select,cancel,timer 等結合,它能實現(xiàn)各種各樣的功能。接下來,我們就要梳理一下 channel 的應用
    2022-10-10
  • Go reflect 反射原理示例詳解

    Go reflect 反射原理示例詳解

    這篇文章主要為大家介紹了Go reflect 反射原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Golang中漏洞數(shù)據(jù)庫的使用詳解

    Golang中漏洞數(shù)據(jù)庫的使用詳解

    govulncheck是Golang中的漏洞掃描工具,它強大功能的背后,離不開?Go?漏洞數(shù)據(jù)庫(Go?vulnerability?database)的支持,所以本文就來為大家詳細講解下?Go?漏洞數(shù)據(jù)庫相關的知識
    2023-09-09
  • Go錯誤處理之panic函數(shù)和recover函數(shù)使用及捕獲異常方法

    Go錯誤處理之panic函數(shù)和recover函數(shù)使用及捕獲異常方法

    這篇文章主要介紹了Go錯誤處理之panic函數(shù)使用及捕獲,本篇探討了如何使用 panic 和 recover 來處理 Go 語言中的異常,需要的朋友可以參考下
    2023-03-03

最新評論

石台县| 岳阳市| 应城市| 社会| 沙田区| 河北省| 乐昌市| 呼伦贝尔市| 克什克腾旗| 阿拉尔市| 衡山县| 华亭县| 丹东市| 丰城市| 东安县| 象州县| 渭源县| 宽城| 广州市| 司法| 通城县| 惠来县| 松溪县| 温州市| 缙云县| 博湖县| 龙州县| 宜阳县| 睢宁县| 离岛区| 盱眙县| 玛曲县| SHOW| 宜兰县| 民丰县| 荥阳市| 麻阳| 南昌县| 马关县| 永嘉县| 玉山县|