è½ç¶è¾è¦ï¼ä½æè¿æ¯ä¼éæ©é£ç§æ»ç«ç人çã
继ç»å¦ä¹
å§
ææ¾åé
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmLwcTN2QDM1gDMxETNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
åæ¯ä¸å¼ 让人è½äº§çxcdçå¾å¢ï¼goçå祥ç©æ»æç§èå°æ¬ æçæè§ï¼ä¸æ¯ï¼
GORM
é¦å å¯ä»¥è¯å®çæ¯ï¼gormä¸æå¾å¿«ï¼å¹¶ä¸ææ¡£åæ ·çä¸å½å¼åè å¾å好
gorm_cnå å«ååé½å ¨çä¸æææ¡£ï¼æäºå®ä½ çè³ä¸éè¦å继ç»åä¸é 读æ¬æ
ä¸å¦æ¿åºä¸ä¸ªå°æ¶å·¦å³çæ¶é´å å»ææ¡£ççå§ï¼
æ个å°è¯¯åºå°±æ¯æåå¦è®¡ç®æºè¿é¨è¯¾çæ¶åï¼ä¸ç´è§å¾ææ¡£æ¯å¤§çæççï¼ç°å¨æç½è¿æ¥å®æ¹ææ¡£å ¶å®æ¯å°ç½æå¿«çå ¥é¨æ¡ä¾ï¼æ以æç¸å ³é¡¾èçæåä¸è¦å®³æããæ¯ç«ææ´è¡é½æ¢ççææ¡£
å®è£
go get -u github.com/jinzhu/gorm
è¿æ¥æ°æ®åº
è¿æ¥ä¸åçæ°æ®åºé½éè¦å¯¼å ¥å¯¹åºæ°æ®ç驱å¨ç¨åºï¼GORMå·²ç»è´´å¿ç为æ们å è£ äºä¸äºé©±å¨ç¨åºï¼åªéè¦æå¦ä¸æ¹å¼å¯¼å ¥éè¦çæ°æ®åºé©±å¨å³å¯ï¼
import _ "github.com/jinzhu/gorm/dialects/mysql"
// import _ "github.com/jinzhu/gorm/dialects/postgres"
// import _ "github.com/jinzhu/gorm/dialects/sqlite"
// import _ "github.com/jinzhu/gorm/dialects/mssql"
第ä¸ä¸ªå°±æ¯mysqlçï¼å ¶ä»ä¸ä¸ªèè»è¿æ²¡ç¨è¿ï¼ï¼å¿å¿ æéè¦çåå¦å¯ä»¥èªå·±ä¸å»æ¸ç´¢ä¸ä¸ã
è¿æ¥MySQL
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() { //å å¯ç æ°æ®åºå
db, err := gorm.Open("mysql", "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
defer db.Close()
}
ä»ä¹ä¿¡æ¯åä»ä¹å°æ¹æ³¨éå·²ç»åäºï¼ç¸ä¿¡å¤§å®¶è·åä¿¡æ¯çè½åè¯å®æ¯æ强å¦ï¼
GORMåºæ¬ç¤ºä¾
1.å建æ°æ®åº
2.GORMæä½MySQL
使ç¨GORMè¿æ¥ä¸é¢çdb1è¿è¡å建ãæ¥è¯¢ãæ´æ°ãå é¤æä½ã
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
// UserInfo ç¨æ·ä¿¡æ¯
type UserInfo struct {
ID uint
Name string
Gender string
Hobby string
}
func main() {
db, err := gorm.Open("mysql", "root:admin@(127.0.0.1:13306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
if err!= nil{
panic(err)
}
defer db.Close()
// èªå¨è¿ç§»
db.AutoMigrate(&UserInfo{})
u1 := UserInfo{1, "å°ç½", "ç·", "篮ç"}
u2 := UserInfo{2, "èæ°", "女", "足ç"}
// å建记å½
db.Create(&u1)
db.Create(&u2)
// æ¥è¯¢
var u = new(UserInfo)
db.First(u)
fmt.Printf("%#v\n", u)
var uu UserInfo
db.Find(&uu, "hobby=?", "足ç")
fmt.Printf("%#v\n", uu)
// æ´æ°
db.Model(&u).Update("hobby", "çç")
// å é¤
db.Delete(&u)
}
GORM Modelå®ä¹
å¨ä½¿ç¨ORMå·¥å ·æ¶ï¼é常æ们éè¦å¨ä»£ç ä¸å®ä¹æ¨¡åï¼Modelsï¼ä¸æ°æ®åºä¸çæ°æ®è¡¨è¿è¡æ å°ï¼å¨GORMä¸æ¨¡åï¼Modelsï¼é常æ¯æ£å¸¸å®ä¹çç»æä½ãåºæ¬çgoç±»åæå®ä»¬çæéã åæ¶ä¹æ¯æsql.Scannerådriver.Valueræ¥å£ï¼interfacesï¼ã
gorm.Model
为äºæ¹ä¾¿æ¨¡åå®ä¹ï¼GORMå ç½®äºä¸ä¸ªgorm.Modelç»æä½ãgorm.Modelæ¯ä¸ä¸ªå å«äºID, CreatedAt, UpdatedAt, DeletedAtå个å段çGolangç»æä½ã
// gorm.Model å®ä¹
type Model struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time
}
IDçè¿ä¸ªuintå¥çæ¯tag,类似äºå£°æ主é®è¿ç§ä½ç¨ï¼å½ç¶å®æ¹ææ¡£ä¸æ¢è¿äºè¯´æï¼å 容æ¯è¾å¤ï¼åå¦ä»¬å¯ä»¥èªå·±å»æ¥è¯¢ä¸ä¸
ä½ å¯ä»¥å°å®åµå ¥å°ä½ èªå·±ç模åä¸ï¼
// å° `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`å段注å
¥å°`User`模åä¸
type User struct {
gorm.Model
Name string
}
没éï¼è¿ä¸ªgorm.modelå°±æ¯è¿æ ·ç¨çããã
å½ç¶ä½ ä¹å¯ä»¥å®å ¨èªå·±å®ä¹æ¨¡å
// ä¸ä½¿ç¨gorm.Modelï¼èªè¡å®ä¹æ¨¡å
type User struct {
ID int
Name string
}
模åå®ä¹ç¤ºä¾
type User struct {
gorm.Model
Name string
Age sql.NullInt64
Birthday *time.Time
Email string `gorm:"type:varchar(100);unique_index"`
Role string `gorm:"size:255"` // 设置å段大å°ä¸º255
MemberNumber *string `gorm:"unique;not null"` // 设置ä¼åå·ï¼member numberï¼å¯ä¸å¹¶ä¸ä¸ä¸ºç©º
Num int `gorm:"AUTO_INCREMENT"` // 设置 num 为èªå¢ç±»å
Address string `gorm:"index:addr"` // ç»addresså段å建å为addrçç´¢å¼
IgnoreMe int `gorm:"-"` // 忽ç¥æ¬å段
}
主é®ã表åãååç约å®
GORM é»è®¤ä¼ä½¿ç¨å为IDçå段ä½ä¸ºè¡¨ç主é®ã
å½ç¶ï¼ä½ å¯ä»¥éè¿tag设置æå ¶ä»çã
// 使ç¨`AnimalID`ä½ä¸ºä¸»é®
type Animal struct {
AnimalID int64 `gorm:"primary_key"`
Name string
Age int64
}
表åï¼Table Nameï¼ï¼è¡¨åé»è®¤å°±æ¯ç»æä½å称çå¤æ°ï¼ä¾å¦ï¼
type User struct {} // é»è®¤è¡¨åæ¯ `users`
// å° User ç表å设置为 `profiles`
func (User) TableName() string {
return "profiles"
}
func (u User) TableName() string {
if u.Role == "admin" {
return "admin_users"
} else {
return "users"
}
}
// ç¦ç¨é»è®¤è¡¨åçå¤æ°å½¢å¼ï¼å¦æ置为 trueï¼å `User` çé»è®¤è¡¨åæ¯ `user`
db.SingularTable(true)
ä¹å¯ä»¥éè¿Table()æå®è¡¨åï¼
// 使ç¨Userç»æä½å建å为`deleted_users`ç表
db.Table("deleted_users").CreateTable(&User{})
var deleted_users []User
db.Table("deleted_users").Find(&deleted_users)
SELECT * FROM deleted_users;
db.Table("deleted_users").Where("name = ?", "jinzhu").Delete()
DELETE FROM deleted_users WHERE name = 'jinzhu';
ååï¼Column Nameï¼
type User struct {
ID uint // column name is `id`
Name string // column name is `name`
Birthday time.Time // column name is `birthday`
CreatedAt time.Time // column name is `created_at`
}
è¿ä¸ªè·springboot data JPAçè§åæºåçï¼è½ç¶æä¸æä¹ç¨JPAå°±æ¯äºãã
注æè¿äºé½æ¢æå°åäºï¼ç¶å驼峰ä¹é´æ¢æâ_âã
å¯ä»¥ä½¿ç¨ç»æä½tagæå®ååï¼
type Animal struct {
AnimalId int64 `gorm:"column:beast_id"` // set column name to `beast_id`
Birthday time.Time `gorm:"column:day_of_the_beast"` // set column name to `day_of_the_beast`
Age int64 `gorm:"column:age_of_the_beast"` // set column name to `age_of_the_beast`
}
æ以说tagçä½ç¨å¾å¤å¾æï¼è·springCloudä¸é´ä»¶ä»¬ä¹±ä¸å «ç³çé ç½®ä¸æ ·ï¼ï¼æ¯å¦ä¸´æ¶å³å®æä¹ åï¼çæ´æ°ï¼æ¢ä¸ªæ°æ®åºæºä»ä¹çï¼é½æ¯å è¡ä»£ç åçäºï¼ä¸è¿å¾ç»ãã
æ¶é´æ³è·è¸ªï¼å°±æ¯modeléé¢çä¸ä¸ªãã
å¦æ模åæ CreatedAtå段ï¼è¯¥å段çå¼å°ä¼æ¯å次å建记å½çæ¶é´ã
db.Create(&user) // `CreatedAt`å°ä¼æ¯å½åæ¶é´
// å¯ä»¥ä½¿ç¨`Update`æ¹æ³æ¥æ¹å`CreateAt`çå¼
db.Model(&user).Update("CreatedAt", time.Now())
UpdatedAt
å¦æ模åæUpdatedAtå段ï¼è¯¥å段çå¼å°ä¼æ¯æ¯æ¬¡æ´æ°è®°å½çæ¶é´ã
db.Save(&user) // `UpdatedAt`å°ä¼æ¯å½åæ¶é´
db.Model(&user).Update("name", "jinzhu") // `UpdatedAt`å°ä¼æ¯å½åæ¶é´
DeletedAt
å¦æ模åæDeletedAtå段ï¼è°ç¨Deleteå é¤è¯¥è®°å½æ¶ï¼å°ä¼è®¾ç½®DeletedAtå段为å½åæ¶é´ï¼èä¸æ¯ç´æ¥å°è®°å½ä»æ°æ®åºä¸å é¤ã
以ä¸ï¼å°±æ¯gormçå ¥é¨ã
以ä¸ï¼å°±æ¯gormçcrud.
æ³å¥crudå¢ï¼æ²¡æï¼
çææ¡£å¦ä¹ å»ï¼ï¼å¤ªå¤äºããã
ç´æ¥è¯´æ¸ ådemoçå®æã
é¦å å端çè·åå°ç¹æ¯ï¼
æ·»å é¾æ¥æè¿°
lesson25çstaticå°±æ¯å¦ã
å端crud代ç ç´æ¥å¸¦æ³¨époä¸æ¥ï¼
package main
import (
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"net/http"
)
var (
DB *gorm.DB
)
//Todo model
type Todo struct {
ID int `json:"id"`
Title string `json:"title"`
Status bool `json:"status"`
}
func initMySQL() (err error) {
dsn := "root:[email protected](127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"
//Openä¼è¿åé误ï¼æ以å¨ä¸é¢å®ä¹ä¸ä¸ªå
¨å±çDB,goçerrå¤çççä¸è¬è¬ï¼å¾æ··ä¹±çæè§
//=èä¸ç¨ï¼=æ¯ä¸ºäºå
¨å±èä¸æ¯å¨initMySQLéé¢ä½¿ç¨DB~~~
//è¿éè¶
级éè¦*3
DB, err = gorm.Open("mysql", dsn)
if err != nil {
return
}
//æµè¯è¿éæ§
return DB.DB().Ping()
}
func main() {
//å建æ°æ®åº
//sql
//è¿æ¥æ°æ®åº
err := initMySQL()
if err != nil {
panic(err)
}
//ç¨åºå
³éæ°æ®åºè¿æ¥
defer DB.Close()
//模åç»å®
DB.AutoMigrate(&Todo{})
r := gin.Default()
r.Static("/static", "static")
r.LoadHTMLFiles("templates/*")
r.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", nil)
})
//v1
//crud
//å¡«å
代ç
//å¾
åäºé¡¹
//æ·»å
//æ¥ç
//ä¿®æ¹
//å é¤
v1Group := r.Group("v1")
{
v1Group.POST("/todo", func(c *gin.Context) {
//å端填å代åäºé¡¹
//æ¿æ°æ®
var todo Todo
c.BindJSON(&todo)
err=DB.Create(&todo).Error;
if err!=nil{
c.JSON(http.StatusOK,gin.H{"error":err.Error()})
}else {
c.JSON(http.StatusOK,todo)
}
//æ¾æ°æ®å°æ°æ®åº
//è¿åååº
})
v1Group.GET("/todo", func(c *gin.Context) {
//æ¥è¯¢todoæææ°æ®
var todoList []Todo
if err=DB.Find(&todoList).Error;err!=nil{
c.JSON(http.StatusOK,gin.H{"error":err.Error()})
}else{
c.JSON(http.StatusOK,todoList)
}
})
v1Group.PUT("/todo/:id", func(c *gin.Context) {
id,ok:=c.Params.Get("id")
var todo Todo
if !ok{
c.JSON(http.StatusOK,gin.H{"error":"idä¸åå¨"})
return
}
if err= DB.Where("id=?",id).First(&todo).Error;err!=nil{
c.JSON(http.StatusOK,gin.H{"error":err.Error()})
return
}
c.BindJSON(&todo)
if err =DB.Save(&todo).Error;err!=nil{
c.JSON(http.StatusOK,gin.H{"error":err.Error()})
}else {
c.JSON(http.StatusOK,todo)
}
})
v1Group.DELETE("todo/:id", func(c *gin.Context) {
id,ok:=c.Params.Get("id")
if !ok{
c.JSON(http.StatusOK,gin.H{"error":"idä¸åå¨"})
return
}
if err=DB.Where("id=?",id).Delete(Todo{}).Error;err!=nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
}else {
c.JSON(http.StatusOK,gin.H{id:"deleted"})
}
})
}
r.Run()
}
以ä¸ï¼å°±æ¯gormçå ¥é¨å°å®æï¼è®°å¾å¤çææ¡£åå客èµæ~