成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言使用 XORM 操作 MySQL 的陷阱

數據庫 MySQL
本文我們介紹了使用 XORM 操作 MySQL 時,新手讀者朋友們可能會遇到的陷阱,希望可以給大家帶來一些幫助。

01 介紹

在 Go 語言開發中,大家為了方便,通常會選擇使用 ORM 操作數據庫,比如使用 XORM 或 GORM 操作 MySQL。

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

本文我們來介紹一下使用 XORM[3] 操作 MySQL 可能會遇到的陷阱。

02 使用 XORM 操作 MySQL 的陷阱

類型零值

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

示例代碼:

package main

import (
 "fmt"
 _ "github.com/go-sql-driver/mysql"
 "xorm.io/xorm"
)

func main() {
 // 創建 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
 }

 // 更新數據
 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"`
}

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

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

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

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

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

自增 id

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

// 插入數據
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)

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

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

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

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

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

更新 created 字段

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

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

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

// 更改數據
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)

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

我們換一種更新數據的方式,代碼如下:

// 更改數據
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)

閱讀上面這段代碼,我們可以發現使用 Exec 方法執行原生 SQL 可以滿足我們的需求。

03 總結

本文我們介紹了使用 XORM 操作 MySQL 時,新手讀者朋友們可能會遇到的陷阱,希望可以給大家帶來一些幫助。

讀者朋友們在使用 XORM 或 GORM 操作 MySQL 時,還遇到過哪些陷阱,歡迎讀者朋友們在留言區分享。

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2021-10-26 10:51:30

GoxormMySQL

2023-06-26 00:03:55

Go語言類型

2021-07-08 23:53:44

Go語言拷貝

2024-01-07 23:11:16

defer?Go語言

2020-07-02 16:20:36

MySQLCURD數據庫

2021-01-23 12:47:19

MySQL數據庫Go語言

2024-01-07 19:54:51

2021-01-27 10:01:46

MySQL數據庫SQLX

2024-03-25 07:22:50

GolangMySQL數據庫

2024-12-30 00:38:23

Go語言微服務

2023-01-31 08:48:49

Go語言文件

2024-05-10 08:36:40

Go語言對象

2022-06-05 23:30:25

AES加密算法

2024-10-28 00:40:49

Go語法版本

2010-07-14 17:03:52

編程語言

2012-10-08 09:25:59

GoGo語言開發語言

2023-12-04 18:31:59

C語言函數

2024-06-12 08:54:49

Go切片參數

2022-11-06 23:17:23

Go語言項目

2022-08-08 08:31:55

Go 語言閉包匿名函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99re66在线观看精品热 | 精品国产一区二区国模嫣然 | 日韩av免费在线观看 | 亚洲一二三区在线观看 | 涩涩片影院 | 久草视频网站 | 美女精品一区 | 中文字幕蜜臀av | 国产在线精品一区二区三区 | 91精品国产色综合久久 | 91精品国产91久久久久久吃药 | 日韩精品一区二区三区四区 | 在线中文字幕亚洲 | 一级片在线免费播放 | 久久久久久国产 | 亚洲视频中文 | 久久国产欧美日韩精品 | 9191av| 欧美日韩国产中文字幕 | 综合久 | 亚洲精品日韩在线观看 | 精品国产伦一区二区三区观看体验 | 亚洲视频第一页 | 国产精品99一区二区 | 国产精品久久久久久久久久久久 | 二区中文字幕 | 亚洲三级在线 | 久久久久免费观看 | 青草视频在线 | 亚洲精品国产一区 | 久久精品亚洲国产奇米99 | 91成人免费观看 | 91在线最新 | 成人精品一区二区三区中文字幕 | 在线免费观看亚洲 | 国产日韩精品在线 | 色天天综合 | 天天拍天天射 | 免费视频99 | 日本成人片在线观看 | 国精产品一区二区三区 |