成人免费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語言對象

2024-10-28 00:40:49

Go語法版本

2022-06-05 23:30:25

AES加密算法

2010-07-14 17:03:52

編程語言

2023-12-04 18:31:59

C語言函數

2012-10-08 09:25:59

GoGo語言開發語言

2024-06-12 08:54:49

Go切片參數

2015-01-21 15:40:44

GoRuby

2014-04-09 09:32:24

Go并發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人小视频在线观看 | 一级二级三级在线观看 | 97人人草| 国产精品久久久久久亚洲调教 | www狠狠干| 国产精品一区在线观看 | 亚洲一区久久 | 国产精品久久久久久久岛一牛影视 | 亚洲一区二区三区在线 | 欧美mv日韩mv国产网站91进入 | 国产精品久久久久久久久久三级 | 国产精品1 | 亚洲精品一区二区三区四区高清 | 美女黄视频网站 | 中文字幕第一页在线 | 久久99精品视频 | 产真a观专区 | 国产精彩视频 | 亚洲最大成人综合 | 中文字幕91av| 天堂资源 | 国产在线网站 | 中文字幕一区二区三区四区五区 | 6080亚洲精品一区二区 | 久久亚洲二区 | ririsao久久精品一区 | 久久久久久久久91 | 国产99免费视频 | 在线免费观看黄网 | 日本大片在线播放 | 亚洲欧美另类在线 | 免费一级做a爰片久久毛片潮喷 | 亚洲中国字幕 | 男人天堂社区 | 亚洲一区 | japanhdxxxx裸体 | 日韩毛片在线视频 | 国产99免费| 天天躁日日躁狠狠躁2018小说 | 91干b| 日韩一区二区在线视频 |