æ¾ÂÂç« æ¯ä¸Âç¯ÂGOè¯Âè¨ÂÃ¥ÂÂ端å®Âè·µæÂÂç« ï¼Â主è¦Âå 容æ¯ä»Âç»ÂæÂÂä¹Â使ç¨GORMæÂ¥è¿ÂæÂ¥ï¼Â并ä¸Âå®Âç°æ°æ®åºÂçÂÂå¢Âå æ¹æÂ¥æÂÂä½ÂãÂÂ
GORMä»Âç»Â
GORMï¼ÂGo Object Relational Mappingï¼Âæ¯ Go è¯Âè¨Âä¸ÂæÂÂÃ¥ÂÂ欢è¿Âç ORMï¼Â对象堳系æ å°Âï¼ÂåºÂä¹Âä¸ÂãÂÂå®ÂæÂÂä¾ÂäºÂç®ÂÃ¥ÂÂä¸Â强大çÂÂæ¹å¼Âæ¥尠Go è¯Âè¨ÂçÂÂç»ÂæÂÂä½Âä¸Â堳系åÂÂæ°æ®åºÂä¹Âé´è¿Âè¡Âæ å°Âï¼Â使å¾Âå¼ÂÃ¥ÂÂè è½å¤Â使ç¨é¢åÂÂ对象çÂÂæ¹å¼ÂæÂ¥è¿Âè¡Âæ°æ®åºÂæÂÂä½Âï¼ÂèÂÂæ éÂÂç´æÂ¥ç¼ÂÃ¥ÂÂÃ¥ÂÂå§Âç SQL è¯Âå¥ãÂÂ
GORMçÂÂ主è¦Âç¹ç¹æÂÂæ¯æÂÂå¤Âç§Âæ°æ®åºÂ驱å¨ï¼ÂæÂÂäºÂ使ç¨ï¼Âèªå¨è¿Â移ï¼Âæ°æ®åºÂå ³èÂÂçÂÂçÂÂãÂÂæ»ä½ÂèÂÂè¨Âï¼ÂGORM æ¯ä¸Â个åÂÂè½é½Âå ¨ä¸ÂæÂÂäºÂ使ç¨ç ORM åºÂï¼Âå®Â使徠Go è¯Âè¨Âå¼ÂÃ¥ÂÂè å¯以æ´å é«ÂæÂÂå°ä¸Âæ°æ®åºÂ交äºÂï¼ÂæÂÂé«ÂäºÂå¼ÂÃ¥ÂÂæÂÂçÂÂÃ¥ÂÂ代ç Âè´¨éÂÂãÂÂ
GORMè¿ÂæÂ¥æ°æ®åºÂ
1.å®Â裠驱å¨
è¦Â使ç¨GORMè¿ÂæÂ¥æ°æ®åºÂï¼Âé¦Âå Âè¿Âè¡Âå®Â裠GORM ç MySQL 驱å¨ãÂÂ
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
æÂÂæÂÂï¼Â
éÂÂè¦Â注æÂÂçÂÂæ¯ï¼Âä¾ÂèµÂè¦Âå®Âè£Â
å¨项ç®æÂÂ件夹ä¸Âï¼Âå®Âè£Â
æÂÂÃ¥ÂÂÃ¥ÂÂæÂÂ件夹åÂÂ
ä¼Âå¤Âåºä¸Â个go.sumçÂÂæÂÂ件ãÂÂ
2.è¿ÂæÂ¥æ°æ®åºÂ
使ç¨GORMè¿ÂæÂ¥æ°æ®åºÂï¼Â第ä¸ÂæÂ¥åÂ
Â导åÂ
Â¥GORMÃ¥ÂÂmysql驱å¨çÂÂÃ¥ÂÂ
ï¼Âå¨å®ÂéÂÂ
æÂÂä½Âä¸Âä¼Âç¨å°åÂ
³é®åºÂï¼Âç¶åÂÂå®Âä¹Âæ°æ®åºÂçÂÂè¿Âæ¥信æ¯ï¼Âç¨è¿Â个信æ¯æÂ¥è¿ÂæÂÂ¥mysqlï¼Âè·åÂÂæ°æ®åºÂè¿Âæ¥对象è¿Âè¡ÂéÂÂè¦ÂçÂÂæÂÂä½Âï¼Âè¿ÂæÂ¥æÂÂÃ¥ÂÂÃ¥ÂÂå¨ç¨ÂåºÂéÂÂåºåÂÂè¦ÂÃ¥Â
³éÂÂè¿ÂæÂ¥ãÂÂ
代ç Âå¦Âä¸Âï¼Â
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// æ°æ®åºÂè¿Âæ¥信æ¯
dsn := "root:123456@tcp(127.0.0.1:3306)/sqll?charset=utf8mb4&parseTime=True&loc=Local"
// è¿ÂæÂ¥æ°æ®åºÂ
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("è¿ÂæÂ¥æ°æ®åºÂ失败ï¼Â" + err.Error())
}
// ç¨ÂåºÂéÂÂåºåÂÂÃ¥Â
³éÂÂæ°æ®åºÂè¿ÂæÂÂ¥
sqlDB, err := db.DB()
if err != nil {
panic("è·åÂÂæ°æ®åºÂè¿Âæ¥对象失败ï¼Â" + err.Error())
}
defer sqlDB.Close()
fmt.Println("è¿ÂæÂ¥æÂÂÃ¥ÂÂ")
}
æ°æ®åºÂè¿ÂæÂ¥çÂÂéÂÂç¨格å¼Âæ¯ï¼Â
dsn := "user:password@tcp(ip:port)/database_name?charset=utf8mb4&parseTime=True&loc=Local"
å³ï¼Âç¨æ·åÂÂ:å¯Âç Â@tcp(ip:port)/æ°æ®åºÂ?charset=utf8mb4&parseTime=True&loc=Local
è¿Â个æ°æ®åºÂè¿ÂæÂ¥åÂÂ
æ¾°æ®åºÂç¨æ·åÂÂãÂÂå¯Âç ÂãÂÂæ°æ®åºÂå°åÂÂãÂÂ端å£å·以åÂÂæ°æ®åºÂÃ¥ÂÂ称çÂÂä¿¡æ¯ãÂÂ
éÂÂè¿ gorm.Open()
æ¹æ³Âï¼ÂæÂÂ们使ç¨æÂÂå®ÂçÂÂæ°æ®åºÂè¿ÂæÂ¥åÂÂ符串 dsn æÂ¥è¿ÂæÂ¥å° MySQL æ°æ®åºÂãÂÂå¦ÂæÂÂè¿ÂæÂ¥è¿Âç¨Âä¸Âåºç°éÂÂ误ï¼ÂæÂÂ们ä¼Â使ç¨ panic()
æ¹æ³Âç»Âæ¢ç¨ÂåºÂ并è¾ÂåºéÂÂ误信æ¯ãÂÂ
使ç¨ db.DB()
æ¹æ³Âï¼ÂæÂÂ们è·åÂÂäºÂåºÂå±Âç *sql.DB
对象 sqlDB
ãÂÂå¨ GORM ä¸Âï¼Âdb.DB()
ç¨äºÂè¿Âå *sql.DB
对象ï¼Âå®Âæ¯åºÂå±Âæ°æ®åºÂæÂÂä½ÂçÂÂæ ¸å¿Â对象ãÂÂ
éÂÂè¿ defer
Ã¥Â
³é®åÂÂï¼ÂæÂÂ们å¨ç¨ÂåºÂéÂÂåºåÂÂå°Âä¼Âèªå¨è°Âç¨ sqlDB.Close()
æ¹æ³ÂæÂ¥åÂ
³éÂÂæ°æ®åºÂè¿ÂæÂ¥ãÂÂæÂÂÃ¥ÂÂæÂÂå°è¿ÂæÂ¥æÂÂÃ¥ÂÂãÂÂ
GORMå¢Âå æ¹æÂÂ¥
对æ°æ®åºÂè¿Âè¡ÂæÂÂä½Âé¦ÂÃ¥Â
Âè¦ÂÃ¥ÂÂçÂÂæ¯è¿ÂæÂ¥æ°æ®åºÂï¼Âè¿ÂæÂ¥æÂÂÃ¥ÂÂÃ¥ÂÂï¼Âï¼Âè·åÂÂå°è·åÂÂäºÂåºÂå±ÂçÂÂà*sql.DB
à对象àsqlDB
ï¼ÂÃ¥Â
³éÂÂè¿ÂæÂ¥ï¼Âç¨sqlDBå®ÂæÂÂÃ¥ÂÂç§ÂæÂÂä½ÂãÂÂ
æ¬ç¯ÂæÂÂç« å¢Âå æ¹æÂ¥è¿Âé¨åÂÂå®Âä¾Â代ç Âé»Â认å¨ä¸Âé¢å®Âä¾Â代ç ÂçÂÂåºç¡Âä¸Âè¿Âè¡ÂçÂÂï¼Â
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// æ°æ®åºÂè¿Âæ¥信æ¯
dsn := "root:123456@tcp(127.0.0.1:3306)/sqll?charset=utf8mb4&parseTime=True&loc=Local"
// è¿ÂæÂ¥æ°æ®åºÂ
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("è¿ÂæÂ¥æ°æ®åºÂ失败ï¼Â" + err.Error())
}
// ç¨ÂåºÂéÂÂåºåÂÂÃ¥Â
³éÂÂæ°æ®åºÂè¿ÂæÂÂ¥
sqlDB, err := db.DB()
if err != nil {
panic("è·åÂÂæ°æ®åºÂè¿Âæ¥对象失败ï¼Â" + err.Error())
}
defer sqlDB.Close()
}
ä¸Â述代ç Âï¼Âè¿ÂæÂ¥äºÂä¸Â个sqllæ°æ®åºÂï¼Âè·åÂÂå°sql.DBãÂÂ
表åÂÂ建
å®Âç°åÂÂ建ä¸Â个Users表ãÂÂå¨ GORM ä¸Âï¼Âæ°建ä¸Â个表å¯以éÂÂè¿Â以ä¸Âå 个æ¥骤æÂ¥å®Âç°ï¼Â
- Ã¥ÂÂ建ä¸Â个ä¸Â表对åºÂçÂÂ模åÂÂç»ÂæÂÂï¼Âé¦Âå Âï¼ÂéÂÂè¦ÂÃ¥ÂÂ建ä¸Â个 Go ç»ÂæÂÂä½Âï¼Âç¨äºÂå®Âä¹Âæ°表çÂÂÃ¥ÂÂ段åÂÂå±Âæ§ãÂÂè¿Â个ç»ÂæÂÂä½ÂéÂÂè¦Â对åºÂæ°æ®åºÂ表çÂÂç»ÂæÂÂãÂÂ
- è¿Â移æ°æ®åºÂï¼Âä¸Âæ¦你å®Âä¹ÂäºÂ模åÂÂç»ÂæÂÂï¼Âä½ éÂÂè¦Â使ç¨ GORM æÂÂä¾ÂçÂÂè¿Â移åÂÂè½æÂ¥èªå¨åÂÂ建æ°æ®åºÂ表ãÂÂè¿Â移æ¯ GORM ä¸Âç¨äºÂå¤ÂçÂÂæ°æ®åºÂ模å¼ÂÃ¥ÂÂæ´çÂÂ工堷ãÂÂ
imort(...)
type User struct {
ID int `gorm:"primaryKey"`
Name string
Age int
}
func main(){
...
defer sqlDB.Close()
err = db.AutoMigrate(&Users{})
if err != nil {
panic("æ°æ®åºÂè¿Â移失败ï¼Â" + err.Error())
}
}
è¿Â段代ç Âä¸Âï¼Âå®Âä¹ÂäºÂä¸Â个æ°çÂÂ模åÂÂç»Âæ User
ï¼Â该ç»ÂæÂÂä½Â对åºÂæ°表çÂÂÃ¥ÂÂ段åÂÂå±Âæ§ãÂÂç¶åÂÂï¼ÂæÂÂ们使ç¨ db.AutoMigrate(&Users{})
è¿Âè¡Âæ°æ®åºÂè¿Â移ï¼Âèªå¨åÂÂ建æ°çÂÂæ°æ®åºÂ表ãÂÂ
表æ°æ®å¢ÂÃ¥ÂÂ
è¦Âå “users” 表ä¸ÂæÂÂå ¥æ°çÂÂæ°æ®ï¼Âå¯以使ç¨ Create æ¹æ³ÂãÂÂÃ¥ÂÂ建ä¸Â个æ°ç User 对象ï¼Â并éÂÂè¿ Create æ¹æ³Âå°Âå ¶ä¿ÂÃ¥ÂÂå°æ°æ®åºÂä¸ÂãÂÂ
...
defer sqlDB.Close()
newUser := User{ID: 2, Name: "John", Age: 25}
db.Create(&newUser)
Ã¥ÂÂ建ä¸Â个User对象ï¼Â设å®Â好ä¸Â个æÂÂÃ¥ÂÂçÂÂå¼ï¼Â使ç¨db.Createä¿ÂÃ¥ÂÂå°表å ãÂÂ
表æ°æ®æÂÂå°
...
defer sqlDB.Close()
// æ¥询æ°æ®åºÂ表 "users" çÂÂÃ¥ÂÂ
容
var users []User
if err := db.Find(&users).Error; err != nil {
panic("æ¥询æ°æ®åºÂ失败ï¼Â" + err.Error())
}
// æÂÂå°æ¥询ç»ÂæÂÂ
fmt.Println("user表åÂÂ
容ï¼Â")
for _, user := range users {
fmt.Printf("ID: %d, Name: %s, Age: %d\n", user.ID, user.Name, user.Age)
}
å¨ä¸Âé¢çÂÂ代ç Âä¸Âï¼ÂæÂÂ们å®Âä¹ÂäºÂä¸Â个丠“users” 表对åºÂçÂÂ模åÂÂç»Âæ User
ãÂÂç¶åÂÂï¼Â使ç¨ db.Find(&users)
æ¥询æ°æ®åºÂ表 “users” çÂÂÃ¥ÂÂ
容ï¼Â并å°Âæ¥询ç»ÂæÂÂä¿ÂÃ¥ÂÂå¨ users
Ã¥ÂÂçÂÂä¸ÂãÂÂ
æÂÂÃ¥ÂÂï¼ÂæÂÂ们éÂÂå users
Ã¥ÂÂçÂÂï¼Â并使ç¨ fmt.Printf
æ¥格å¼ÂÃ¥ÂÂæÂÂå° “users” 表ä¸ÂçÂÂæ¯Âæ¡记å½Âç IDãÂÂName å Age Ã¥ÂÂ段ãÂÂ
ç»ÂæÂÂï¼Â
表æ°æ®æ¥询
è¦Âä» “user” 表ä¸Âæ¥询æ°æ®ï¼Âå¯以使ç¨ Find
ãÂÂFirst
æ Where
çÂÂæ¹æ³ÂãÂÂ
//æ ¹æ®æ¡件æ¥询ç¨æ·
var users []User
if err := db.Where("age< ?", 20).Find(&users).Error; err != nil {
panic("æ¥询æ°æ®åºÂ失败ï¼Â" + err.Error())
}
// æ¥询第ä¸Â个ç¨æ·
var firstUser User
db.First(&firstUser)
// æ ¹æ®æ¡件æ¥询æÂÂä¸Â个ç¨æ·
var user User
db.Where("age > ?", 30).First(&user)
表æ°æ®å é¤
ä»Âæ°æ®åºÂ表ä¸Âå é¤æ°æ®ï¼Âå¯以使ç¨Deleteæ¹æ³ÂãÂÂ
nUser := User{ID: 2, Name: "John", Age: 25}
db.Delete(&nUser)
表æ°æ®修æ¹
è¦Âä¿®æ¹æ°æ®åºÂ表çÂÂæÂÂæ¡æ°æ®ï¼Âå¯以使ç¨ Model
æ¹æ³ÂæÂ¥æÂÂå®Âæ´æ°çÂÂ对象ï¼Âç¶åÂÂéÂÂè¿ Updates
æ Update
æ¹æ³Âæ´æ°åÂÂ段ãÂÂ
user := User{ID: 4}
db.Model(&user).Updates(User{Age: 28})
è¿Â段代ç Âå°Âusers表ä¸Âid为4çÂÂè®°å½ÂçÂÂå¹´é¾Âä¿®æ¹æÂÂäºÂ28ï¼Âä¿®æ¹çÂÂå 容å¨Updatesæ¹æ³Âä¸ÂãÂÂ
表å é¤
è¦Âå¨ GORM ä¸Âå é¤ “user” 表ï¼Âå¯以使ç¨ Migrator
对象ç DropTable
æ¹æ³ÂãÂÂMigrator
对象ç¨äºÂå¤ÂçÂÂæ°æ®åºÂçÂÂè¿Â移æÂÂä½Âï¼Âè DropTable
æ¹æ³Âç¨äºÂå é¤表ãÂÂ
代ç Âï¼Â
// è·å Migrator 对象
migrator := db.Migrator()
// å é¤ "users" 表
if migrator.HasTable(&User{}) {
migrator.DropTable(&User{})
fmt.Println("users表å é¤æÂÂÃ¥ÂÂ")
} else {
fmt.Println("users表ä¸ÂÃ¥ÂÂå¨")
}
å¨ä¸Â述代ç Âä¸Âï¼ÂæÂÂ们使ç¨ db.Migrator()
è·åÂÂ亠Migrator 对象ï¼Âç¶åÂÂ使ç¨ migrator.HasTable(&User{})
å¤æ “users” 表æ¯å¦åÂÂå¨ãÂÂå¦ÂæÂÂÃ¥ÂÂå¨ï¼ÂæÂÂ们使ç¨ migrator.DropTable(&User{})
æ¹æ³ÂæÂ¥å é¤ “users” 表ãÂÂ
æ»ç»Â
GORMæÂÂä¾ÂäºÂÃ¥ÂÂæÂÂç¨ç APIï¼Â使å¾Âæ°æ®çÂÂå¢Âå æ¹æÂ¥çÂÂæÂÂä½ÂÃ¥ÂÂå¾Âç®ÂÃ¥ÂÂæÂÂäºÂï¼Âè¿ÂæÂÂä¾ÂäºÂ丰å¯ÂçÂÂæ¥询æ¹æ³Âï¼Âå Â许éÂÂè¿Âé¾å¼Âè°Âç¨æÂ¥æÂÂ建å¤ÂæÂÂçÂÂæ¥询æ¡件ï¼Âä¾ÂäºÂèªå¨è¿Â移åÂÂè½ï¼Âå¯以根æ®模åÂÂç»ÂæÂÂèªå¨åÂÂ建ãÂÂæ´æ°æ°æ®åºÂ表ç»ÂæÂÂï¼Â使å¾Âæ°æ®åºÂçÂÂÃ¥ÂÂæ´管çÂÂÃ¥ÂÂå¾Âç®ÂÃ¥ÂÂï¼Âæ éÂÂ堳注æ°æ®åºÂçÂÂåºÂå±Âç»ÂèÂÂãÂÂ
GOè¯Âè¨Â使ç¨GORMè¿ÂæÂ¥æ°æ®åºÂè¿Âè¡ÂæÂÂä½ÂçÂÂåºæ¬æµÂç¨Âï¼Â
1.å¨项ç®æÂÂ件夹ä¸Âå®Âè£Â
对åºÂä¾ÂèµÂ
2.å¨项ç®åÂÂ
导åÂ
Â¥GORMÃ¥ÂÂmysql驱å¨çÂÂÃ¥ÂÂ
ï¼Âç¶åÂÂå®Âä¹Âæ°æ®åºÂçÂÂè¿Âæ¥信æ¯
3.è·åÂÂdb对象ï¼Âå¤æÂÂæ¯å¦è¿ÂæÂ¥æÂÂÃ¥ÂÂ
4.è·åÂÂå°åºÂå±ÂçÂÂà*sql.DB
à对象àsqlDB
ï¼ÂÃ¥Â
³éÂÂè¿ÂæÂÂ¥
5.è¿Âè¡ÂÃ¥Â
·ä½ÂçÂÂæ°æ®åºÂæÂÂä½Â