ä»Â天æÂÂ主è¦Âæ³åÂÂ大家ä»Âç»Âä¸Âä¸Âèª己å¨å¦习ginæ¡Âæ¶以åÂÂGORMä¸ÂçÂÂæ´个详ç»Âè¿Âç¨Âï¼Âä½Â为ä¸Â个Goå°Âç½ï¼ÂÃ¥ÂÂå¦习æ¶就æÂÂè§Âå°ä¸Â西å¾Âå¤Âï¼ÂæÂÂ以ï¼ÂæÂÂæÂÂèª己å¦习çÂÂè¿Âç¨ÂéÂÂ常详ç»ÂçÂÂÃ¥ÂÂäºÂåºæÂ¥ï¼Âå¸ÂæÂÂä¹Âè½帮å©å°é£äºÂÃ¥ÂÂæÂÂä¸Âæ ·ä¸ÂçÂ¥éÂÂå¦Âä½Âå ¥æÂÂçÂÂå°Âç½ï¼Âç»Â你们æÂÂä¾Âä¸ÂäºÂæÂÂå¦习æ¶çÂÂç»ÂéªÂÃ¥ÂÂæµÂç¨ÂãÂÂ
1 GinçÂÂå®Âè£Â
1.æ°建ä¸Â个gin_demo项ç®æÂÂ件夹:
2.建ä¸Â个go.modæÂÂ件ï¼Âç»Â端è¾Âå ¥ï¼Âgo mod init go.mod
3.æ°建ä¸Â个main.go主å½æ°æÂÂ件
4.Ginå®Âè£Â
GinçÂÂå®Âæ¹æÂÂæ¡£å°åÂÂï¼Âgin-gonic.com/zh-cn/docs
å®Â裠å½令@go get -u github.com/gin-gonic/gin ï¼Âå¦ÂæÂÂ访é®该ç½Âç«Âè¿Âæ ¢æÂÂåºéÂÂï¼Âgolang é Â置代çÂÂãÂÂ_go 代çÂÂ_lyfGeekçÂÂÃ¥ÂÂ客-CSDNÃ¥ÂÂ客å¯以解å³é®é¢Âï¼Â
2 å¼ÂÃ¥ÂÂæµÂç¨Â
1.访é®å°åÂÂãÂÂæÂÂå¡å¨端å£ï¼ÂéÂÂè¿ÂæÂÂå¡å¨端å£å»访é®å°åÂÂï¼ÂèÂÂå°åÂÂå¯以å¤ÂçÂÂ请æ±Âï¼ÂRequestãÂÂResponseï¼Â
1.1.导堥gin
1.2Ã¥ÂÂ建æÂÂå¡
ginServer := gin.Default()
1.3Ã¥ÂÂ建端å£
ginServer.Run(":8082")
1.4éÂÂè¿ÂServerÃ¥ÂÂ建get/post请æ±Â
//Ã¥ÂÂ建请æ±Â,寻æ±Âhello,Ã¥ÂÂæµÂè§Âå¨æÂÂä¸Â声æÂÂå¼,funcè¿ÂÃ¥ÂÂå¼(å½åÂÂå½æ°),å®Âä¼Âè¿ÂÃ¥ÂÂcontext对象(ä¸Âä¸ÂæÂÂå¯以æÂ¥æ¶çÂÂæ°æ®)
ginServer.GET("/hello",func(context *gin.Context){
context.JSON(200,gin.H{"msg":"hello,world"}) //JSON(code int,obj any)
}ï¼Â
æ»ç»Âï¼ÂÃ¥ÂÂ建ä¸Â个æÂÂå¡âÂÂâÂÂ>ç»Âå®Âä¸Â个端å£âÂÂâÂÂ>Ã¥ÂÂä¸Â段代ç ÂæÂ¥æÂ¥æ¶请æ±Âï¼Âè¿Â个请æ±Âä¼Âç»ÂÃ¥ÂÂ端åÂÂåºÂä¸ÂäºÂæ°æ®
代ç Âï¼Â
package main
//导åÂ
Â¥gin
import(
"github.com/gin-gonic/gin"
)
func main() {
//Ã¥ÂÂ建ä¸Â个æÂÂå¡
ginServer := gin.Default()
//访é®å°åÂÂ
ginServer.GET("/hello",func(context *gin.Context){
//Ã¥ÂÂ建请æ±Â,寻æ±Âhello,Ã¥ÂÂæµÂè§Âå¨æÂÂä¸Â声æÂÂå¼,funcè¿ÂÃ¥ÂÂå¼(å½åÂÂå½æ°),å®Âä¼Âè¿ÂÃ¥ÂÂcontext对象(ä¸Âä¸ÂæÂÂå¯以æÂ¥æ¶çÂÂæ°æ®)
context.JSON(200,gin.H{"msg":"hello,world"}) //JSON(code int,obj any)
})
//æÂÂå¡å¨端å£
ginServer.Run(":8082")
}
å¯以éÂÂè¿ÂæÂÂå¼Âä¸Â个æµÂè§Âå¨ï¼Âç¶åÂÂ访é®localhost:8082/hello页é¢åÂÂ端ï¼Âå¯以çÂÂå°ï¼Â
该格å¼Â为JSONæ ¼å¼ÂãÂÂ
ç»Â端çÂÂæ¾示å½令为ï¼Â
æÂÂ们å¯以å¨åÂÂæ¹å ä¸ÂäºÂè¿ÂæÂ¥çÂÂæ°æ®åºÂçÂÂçÂÂãÂÂ
2.1 æ·»å logoå¾åÂÂ
å¨åÂÂ建æÂÂå¡æ¶ï¼Âå Â导堥github.com/thinkerou/favicon çÂÂå ï¼Âç¨go get “github.com/thinkerou/favicon”
导堥åÂÂç¨ginServeræ·»å ä¸Â个favicon.icoå¾åÂÂï¼Â
ä»Âgithubç½Âä¸Âä¸Âè½½ä¸Â个favicon.icoæ¾å¨gin_demoæÂÂ件夹ä¸Â
å 堥å½令ï¼Â
import "github.com/thinkerou/favicon"
主å½æ°ä¸Âå 堥ï¼Â
ginServer.Use(favicon.New("./favicon.ico"))
æÂÂç»Â代ç ÂÃ¥ÂÂæÂÂæÂÂï¼Â
3 RESTful API
以åÂÂçÂÂÃ¥ÂÂç½Âç«Âæ¯éÂÂè¿Â以ä¸Âå½令æÂ¥å®Âç°å¢Âå æ¹æÂ¥ï¼Â
get /user //æÂÂ¥
post /create_user //å¢Â
post /update_user //æ¹
post /dalete_user //Ã¥ÂÂ
RESTful API
get /user //æÂÂ¥
post /user //å¢Â
put /user //æ¹
dalate /user //Ã¥ÂÂ
Ginæ¡Âæ¶ä¹Âæ¯æ¯æÂÂRESTful APIçÂÂå¼ÂÃ¥ÂÂãÂÂ
ä¸Âä¸ÂæÂ¥æÂÂ们åÂÂçÂÂæ¯GET请æ±Âï¼Âä¹Âå¯以使ç¨POSTãÂÂPUT以åÂÂDELTEï¼Âç¶åÂÂç¨postman软件è¿Âè¡ÂæµÂè¯ÂéªÂè¯ÂãÂÂ
4 Ã¥ÂÂåºÂä¸Â个页é¢ç»ÂÃ¥ÂÂ端
é¦Âå ÂéÂÂè¦ÂÃ¥ÂÂä¸Â个åÂÂ端页é¢ï¼Â
å¨å½ÂÃ¥ÂÂæ°建ä¸Â个templatesæÂÂ件夹ï¼Â并å¨templatesä¸Âæ°建ä¸Â个index.html
å 容å¦Âä¸Âï¼Â
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>æÂÂçÂÂ第ä¸Â个Go Web 页é¢</title>
</head>
<body>
<h1>æÂÂ谢大家æ¯æÂÂ</h1>
</body>
</html>
ç¶åÂÂå¨main.goä¸Âå Âå 载该éÂÂæÂÂ页é¢ï¼Â
ginServer.LoadHTMLGlob("templates/*")
Ã¥ÂÂåºÂ页é¢
ginServer.GET("/index",func(context *gin.Context){
//è¿ÂÃ¥ÂÂä¸Â个页é¢
context.HTML(http.StatusOK,"index.html",gin.H{ //HTML(code int,name string,obj any)ï¼Âç¶æÂÂç Âï¼ÂæÂÂ件åÂÂï¼ÂæÂÂ件åÂÂæ°ï¼Â
"msg":"è¿Âæ¯GoÃ¥ÂÂå°传éÂÂæÂ¥çÂÂæ°æ®",
})
//http.StatusOKæ¯htmlèª带çÂÂç¶æÂÂç Âï¼ÂÃ¥Â
¶å®Â200æ¯ä¸Âæ ·çÂÂ
//gin.H{}æ¯Ginæ¡Âæ¶éÂÂçÂÂæ°æ®传éÂÂæ¹æ³Âï¼Âæ¯ä¸Â个mapéÂÂÃ¥ÂÂï¼Âå¯以传任ä½Âkey/value
})
è¿Âè¡Âå®Âè¿ÂäºÂ以åÂÂï¼Â让åÂÂå°æÂ¥æÂ¥æ¶è¿Â个æ°æ®ï¼Â
å¨index.htmlä¸Âå 堥èµÂå¼表达å¼Â{{.msg}}ï¼Âå³å¯ãÂÂ
ç¶åÂÂ访é®localhost:8082/index页é¢ï¼Â
main.go代ç Â
package main
//导åÂ
Â¥gin
import(
"github.com/gin-gonic/gin"
"github.com/thinkerou/favicon" //éÂÂè¦Â导åÂÂ
"net/http"
)
func main() {
//Ã¥ÂÂ建ä¸Â个æÂÂå¡
ginServer := gin.Default()
ginServer.Use(favicon.New("./favicon.ico")) //å åÂ
Â¥logo
//å 载éÂÂæÂÂ页é¢
ginServer.LoadHTMLGlob("templates/*") //页é¢åÂ
¨å±Âå 载ï¼Âè¿ÂæÂÂä¸Â个LoadHTMLFiles()
//æÂÂèÂÂ
ginServer.LoadHTMLFiles("templates/index.html") æ¯Âè¾Â麻ç¦
//Ã¥ÂÂåºÂä¸Â个页é¢ç»ÂÃ¥ÂÂ端
ginServer.GET("/index",func(context *gin.Context){
//context.JSON() //JSON(code int,obj any)ï¼Âç¶æÂÂç Âï¼ÂæÂÂ件åÂÂæ°ï¼Â
context.HTML(http.StatusOK,"index.html",gin.H{ //HTML(code int,name string,obj any)ï¼Âç¶æÂÂç Âï¼ÂæÂÂ件åÂÂï¼ÂæÂÂ件åÂÂæ°ï¼Â
"msg":"è¿Âæ¯GoÃ¥ÂÂå°传éÂÂæÂ¥çÂÂæ°æ®",
})
})
//æÂÂå¡å¨端å£
ginServer.Run(":8082")
}
å¨页é¢ä¸Âå 堥éÂÂæ±ÂcssÃ¥ÂÂjs
å Âå¨项ç®ä¸ÂÃ¥ÂÂ建ä¸Â个staticæÂÂ件夹ï¼ÂÃ¥ÂÂæ¾ä¸Â个cssæÂÂ件夹ï¼Âä¸Â个jsæÂÂ件夹ï¼Âcssä¸ÂÃ¥ÂÂ建ä¸Â个cssæÂÂ件ï¼Â
å 容为ï¼Â
body{
background: aqua;
}
jsä¸Âæ°建ä¸Â个jsæÂÂ件ï¼Âå 容为ï¼Â
alert(1)
ç¶åÂÂå¨index.htmléÂÂæÂÂ页é¢ä¸Â< head >ä¸Âå 堥ï¼Â
<link rel="stylesheet" href="/static/css/style.css">
<script src="/static/js/common.js"></script>
æÂ¥è°ÂÃ¥ÂÂÃ¥ÂÂ好çÂÂjsÃ¥ÂÂcssãÂÂ
å¨main.go主å½æ°æÂÂ件ä¸Âå 载èµÂæºÂ页é¢ï¼Âå 堥代ç Âï¼Â
//å 载èµÂæºÂ页é¢
ginServer.Static("/static","./static") //Static(relativePath,root) ç¸对路å¾ÂÃ¥ÂÂç»Â对路å¾Â
æÂÂç»ÂæÂÂæÂÂ为ï¼Â
æ»ç»Âï¼Â
GOè¯Âè¨Âå¯以åÂÂéÂÂRESTful APIï¼Âä¹Âå¯以ç»ÂÃ¥ÂÂ端åÂÂåºÂ页é¢ãÂÂ
5 è·åÂÂ请æ±Âä¸ÂçÂÂÃ¥ÂÂæ°
ä¼ ç»ÂçÂÂï¼Âä¼ åÂÂï¼Â
//url?userid=xxx&username=xxx (ä¼ ç»ÂçÂÂé®å·æ¼æÂ¥åÂÂæ°)
// /user/info/1/kuangshen (Request Ã¥ÂÂæ ¼çÂÂä¼ åÂÂ)
Goè¯Âè¨ÂçÂÂä¼ åÂÂï¼Â
//æÂ¥æ¶åÂÂ端传è¿ÂæÂ¥çÂÂÃ¥ÂÂæ°uesridï¼Âå¨åÂÂ端å¿Â
é¡»æÂÂÃ¥ÂÂ好çÂÂuseidÃ¥ÂÂæ°ï¼Â
ginServer.GET("/user/info",func(context *gin.Context){
userid := context.Query("userid") //å¨åÂÂ端è·åÂÂå°çÂÂuseridÃ¥ÂÂæ°ï¼ÂèµÂå¼å½令为userid
username := context.Query("username") //å¨åÂÂ端è·åÂÂå°çÂÂusernameÃ¥ÂÂæ°ï¼ÂèµÂå¼å½åÂÂ为username
context.JSON(http.StatusOK,gin.H{ //å°Âè·åÂÂå°çÂÂå¼ï¼Âè¿ÂÃ¥ÂÂç»ÂÃ¥ÂÂ端
"userid":userid,
"username":username,
})
})
è¿Âè¡Âmain.go,Ã¥ÂÂ访é®http://localhost:8082/user/info?userid=12&username=3
ç»ÂæÂÂ为ï¼Â
ginServer.GET("/user/info/:userid/:username/", func(context *gin.Context) {
userid := context.Param("userid") //å¨åÂÂ端è·åÂÂå°çÂÂuseridÃ¥ÂÂæ°ï¼ÂèµÂå¼å½令为userid
username := context.Param("username") //å¨åÂÂ端è·åÂÂå°çÂÂusernameÃ¥ÂÂæ°ï¼ÂèµÂå¼å½åÂÂ为username
context.JSON(http.StatusOK, gin.H{ //å°Âè·åÂÂå°çÂÂå¼ï¼Âè¿ÂÃ¥ÂÂç»ÂÃ¥ÂÂ端
"userid": userid,
"username": username,
})
})
5 Ã¥ÂÂ端ç»ÂÃ¥ÂÂ端传éÂÂä¿¡æ¯
ginServer.POST("/json",func(context *gin.Context){
//request.body
data,_ := context.GetRawData() //GetRawDataï¼Âï¼Â表示è¦ÂæÂ¥åÂÂçÂÂæ°æ®ï¼Â并ä¸ÂèµÂå¼ç»Âdata (为[]byteæ°æ®)
var m map[string]interface{} //interface{}表示空æÂ¥å£
//å°Â[]byteÃ¥ÂÂ
è£Â
为jsonæ°æ®
_ = json.Unmarshal(data,&m) //å°ÂÃ¥ÂÂ端åÂÂéÂÂè¿ÂæÂ¥çÂÂæ°æ®丢æÂÂ
context.JSON(http.StatusOK,m) //Ã¥ÂÂ端åÂÂåºÂ200 OK
})
æÂÂç»ÂæÂÂæÂÂï¼Âï¼Âè®°å¾Âgo run main.goï¼Â
6 ä¼ éÂÂ表åÂÂæ°æ®
å¨index.html(Ã¥ÂÂ端)ä¸ÂÃ¥ÂÂå ¥ï¼Â
<form action="/user/add" method="post">
<p>username:<input type="text" name="username"></p>
<p>password:<input type="text" name="password"></p>
<button type="submit" æÂÂ交></button>
</form>
å¨main.go(Ã¥ÂÂ端)ä¸ÂÃ¥ÂÂå ¥ï¼Â
ginServer.POST("/user/add", func(context *gin.Context) {
username := context.PostForm("username") //PostForm()为ä¸Âé¨å¤ÂçÂÂ表åÂÂçÂÂå½æ°
password := context.PostForm("password") //è·åÂÂÃ¥ÂÂæÂÂÃ¥ÂÂ端åÂÂçÂÂpasswordï¼Âusername
//å¯以å¨è¿ÂéÂÂå åÂ
¥æ ¡éªÂå¯Âç Âï¼ÂÃ¥ÂÂ称æ¯å¦符åÂÂè§ÂèÂÂçÂÂå¤æÂÂæ¡件
context.JSON(http.StatusOK, gin.H{ //Ã¥ÂÂ端åÂÂåºÂæ°æ®
"msg": "ok",
"username": username,
"password": password,
})
})
go run main.go
访é®localhost:8082/index
æÂÂç»ÂæÂÂæÂÂï¼Â
7 Ã¥ÂÂåºÂè·¯ç±ãÂÂéÂÂå®ÂÃ¥ÂÂ
//è·¯ç±
ginServer.GET("/test", func(context *gin.Context) {
//éÂÂå®Âå ç¶æÂÂç Â为301
context.Redirect(http.StatusMovedPermanently, "https://www.baidu.com") //Redirect(intï¼Âstring)表示éÂÂå®ÂÃ¥ÂÂ
//http.StatusMovedPermanently为éÂÂå®ÂÃ¥ÂÂçÂÂç¶æÂÂç Â301
})
访é®localhost:8082/testï¼Âä¼Âç´æ¥跳转å°www.baidu.com 页é¢ãÂÂ
8 404页é¢
main.go
//404 NoRoute
ginServer.NoRoute(func(ctx *gin.Context) {
ctx.HTML(http.StatusNotFound, "404.html", nil) //转å°404.html页é¢ï¼ÂÃ¥ÂÂè¿ÂÃ¥ÂÂ空
//http.StatusNotFound为404ç¶æÂÂç Â
})
templatesæÂÂ件夹ä¸ÂãÂÂæ°建ä¸Â个404.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404</title>
</head>
<body>
<h1>æÂÂçÂÂ404页é¢</h1>
</body>
</html>
go run main.go
éÂÂ便访é®ä¸Â个éÂÂ误页é¢ï¼Âä¾Âå¦Âlocalhost:8082/ladskfjksdjlskadg
ç»ÂæÂÂ为ï¼Â
9 è·¯ç±ç»Â
è·¯ç±ç»Âç¨æÂ¥ç»Âä¸Â管çÂÂè·¯ç±çÂÂå°æ¹ï¼Â
userGroup := ginServer.Group("/user") //第ä¸Â个路ç±ç»Â
{
userGroup.GET("/add") //å¯以åÂÂå func()å½æ°æÂ¥å¤ÂçÂÂ请æ±Â
userGroup.POST("/login")
userGroup.POST("/logout")
}
orderGroup := ginServer.Group("/order") //第äºÂ个路ç±ç»Â
{
orderGroup.GET("/add")
orderGroup.DELETE("/delete")
}
10 ä¸Âé´件ï¼Âæ¦æªå¨ï¼Â
é¦Âå Âèªå®Âä¹Âä¸Â个ä¸Âé´件ï¼Â
å¿ é¡»å¨func main(){}å¤Âèªå®Âä¹Âfunc nyHendlerï¼Âï¼Â
func myHandler()(gin.HandlerFunc){ //gin.HandlerFunc表示è¿ÂÃ¥ÂÂèª己çÂÂHendlerä¸Âé´件
return func(context *gin.Context) {
//éÂÂè¿Âèªå®Âä¹ÂçÂÂä¸Âé´件ï¼Â设置çÂÂå¼ï¼Âå¨åÂÂç»Âå¤ÂçÂÂåªè¦Âè°Âç¨äºÂè¿Â个ä¸Âé´件çÂÂé½å¯以æ¿å°è¿ÂéÂÂÃ¥ÂÂæ°setçÂÂå¼
context.Set("usersesion","userid-1") //ç¨äºÂÃ¥Â
¨å±ÂÃ¥ÂÂéÂÂ
context.Next() //æ¾è¡Âå¯以å åÂ
¥å¤æÂÂï¼ÂæÂ¥æ¾è¡Âè¿Âæ¯éÂȾ¢
context.Abort() //éÂȾ¢
}
}
func main(){
ãÂÂãÂÂãÂÂ
}
ä¹ÂÃ¥ÂÂå¯以è°Âç¨è¿Â个ä¸Âé´件æÂ¥ï¼Âæ¾è¡ÂÃ¥ÂÂéÂȾ¢访é®ï¼Âè¿Âå¯以使ç¨堶ä¸ÂçÂÂusersesionçÂÂå¼çÂÂãÂÂ
ä¾Âå¦Âï¼Â
//æÂ¥æ¶åÂÂ端传è¿ÂæÂ¥çÂÂÃ¥ÂÂæ°uesridï¼Âå¨åÂÂ端å¿Â
é¡»æÂÂÃ¥ÂÂ好çÂÂuseidÃ¥ÂÂæ°ï¼Â
ginServer.GET("/user/info", myHandler(),func(context *gin.Context) {
//Ã¥ÂÂåºä¸Âé´件çÂÂå¼
usersesion := context.MustGet("usersesion").(string)
log.Println("===============>",usersesion)
userid := context.Query("userid")
username := context.Query("username")
context.JSON(http.StatusOK, gin.H{
"userid": userid,
"username": username,
})
})
æÂÂç»ÂæÂÂæÂÂï¼Â
ginServer.GET(“/user/info”, myHandler(),func(context * gin.Context) ä¸Âå¦ÂæÂÂä¸Âå myHendler()ï¼Âå°±ä¼Â表示对堨å±Â使ç¨è¿Â个ä¸Âé´件ï¼ÂèÂ¥å äºÂ就表示åª对è¿Â个è°Âç¨使ç¨ãÂÂ
11 GORM
Gï¼Âgoè¯Âè¨Â
O:Objectï¼Â对象ï¼Âç¨ÂåºÂä¸ÂçÂÂ对象/å®Âä¾Â,ä¾Âå¦ÂGoä¸ÂçÂÂç»ÂæÂÂä½Âå®Âä¾Â
Rï¼ÂRelationalï¼Â堳系æ°æ®åºÂï¼Âä¾Âå¦ÂMySQL
Mï¼ÂMappingï¼Âæ å°Â
ä¾ÂÃ¥ÂÂï¼Â
package main
import(
"github.com/jinzhu/gorm"
)
type UserInfo struct{
ID uint
Name string
Gender string
Hobby string
}
func main(){
u1 := UserInfo{1,"ä¸Âç±³","ç·","篮çÂÂ"}
//å°Âu1æ°æ®导åÂ
¥æ°æ®åºÂ
//SQLè¯Âå¥ï¼Âinsert into userinfo values(1,"ä¸Âç±³","ç·","篮çÂÂ");
//ORMè¯ÂÃ¥ÂÂ¥
orm.Create(&u1)
}
ORM表示äºÂä¸Â个æ å°Â堳系ï¼Â
æ°æ®表<–>ç»ÂæÂÂä½Â
æ°æ®è¡Â<–>ç»ÂæÂÂä½Âå®Âä¾Â
Ã¥ÂÂ段 <–>ç»ÂæÂÂä½ÂÃ¥ÂÂ段
ORMçÂÂä¼Â缺ç¹ï¼Â
ä¼Âç¹ï¼Â
æÂÂé«Âå¼ÂÃ¥ÂÂæÂÂçÂÂ
缺ç¹ï¼Â
çºç²æ§è¡Âè½åÂÂ
çºç²çµ活æ§
å¼±åÂÂSQLè½åÂÂ
12 GORMå®Âè£Â
ç»Â端è¾Âå ¥ï¼Â
go get -u github.com/jinzhu/gorm
12.1 导堥æ°æ®åºÂmysql
import _ "github.com/jinzhu/gorm/dialects/mysql"
12.2 æ°æ®åºÂå®Â裠åÂÂè¿ÂæÂÂ¥
é¤äºÂå¨main.goä¸Âå 以ä¸Â代ç Âå¤Âï¼Âè¿ÂéÂÂä¸Âmysqlæ°æ®åºÂè¿ÂæÂ¥ï¼ÂMySQLçÂÂÃ¥Â
·ä½Âå®Âè£Â
è¿Âç¨Âå¯以åÂÂèÂÂï¼ÂGORMÃ¥Â
¥é¨æÂÂå | æÂÂæÂÂå¨çÂÂÃ¥ÂÂ客 (liwenzhou.com)
æÂÂèÂÂ
èª己å¨MySQLå®Âç½Âä¸Âä¸Âè½½å®Âè£Â
ãÂÂ
12.3 æ°æ®çÂÂå¢Âå æÂ¥æ¹çÂÂå ·ä½Âè¿Âç¨Â
ä¸Â载好åÂÂè¿Âå ¥MySQLï¼Âé¦Âå ÂÃ¥ÂÂ建ä¸Â个æ°æ®åºÂï¼Â
mysql> create database db1;
MySQLå½令ä¸ÂåºåÂÂ大å°ÂÃ¥ÂÂï¼Âä½ÂéÂÂ常åºå®Âä¸ÂÃ¥ÂÂçÂÂæ ¼å¼Âä¼ÂéÂÂç¨大åÂÂ.
è¿Âå ¥db1ï¼Â
mysql> use db1;
å¨main.goä¸ÂÃ¥ÂÂå ¥ï¼Â
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
// UserInfo --> æ°æ®表
type UserInfo struct { //å®Âä¹ÂMySQL表ä¸ÂçÂÂç»ÂæÂÂãÂÂÃ¥ÂÂ称ãÂÂ大å°ÂÃ¥ÂÂç±»åÂÂ
ID uint
Name string
Gender string
Hobby string
}
func main() {
//è¿ÂæÂÂ¥MySQLæ°æ®åºÂ
db, err := gorm.Open("mysql", "root:duibuqi.123@(localhost:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local") //æÂÂå¼Âæ°æ®åºÂmysql
//root(user):ç¨æ·åÂÂ,duibuqi.123(password):å¯Âç Âï¼Â@ï¼Âlocalhostï¼Â3306ï¼Âï¼Â主æºipÃ¥ÂÂ端å£å·,db1(dbname)ï¼Âæ°æ®åºÂÃ¥ÂÂï¼Âcharset=utf8mb4ï¼Âç¼Âç ÂUTF-8ï¼ÂparseTimeï¼ÂæÂÂÃ¥ÂÂæ¶é´ï¼Âlocï¼ÂæΡæ¶é´
if err != nil { //å¦ÂæÂÂéÂÂ误ï¼Âè¿ÂÃ¥ÂÂerr
panic(err)
}
defer db.Close() //Ã¥Â
³éÂÂæ°æ®åºÂ
//æ·»å æ°æ®è¡Â
u1 := UserInfo{2, "qimi", "ç·", "èÂÂæ³³"}
db.Create(&u1)
u2 := UserInfo{3, "2ç±³6", "女", "è·³èÂÂ"}
db.Create(&u2)
}
è¿Âè¡Âmain.goï¼Âä¹ÂÃ¥ÂÂÃ¥ÂÂè¿Âå ¥MySQLä¸Âï¼Â
æµÂè§Âæ°æ®åºÂï¼Â
mysql> show databases;
è¿Âå ¥æ°æ®åºÂï¼Â
mysql> use db1;
æÂ¥çÂÂ表ï¼Â
mysql> show tables;
便å¯以çÂÂå°åÂÂæÂÂèª己æ°å 堥çÂÂ表
æÂ¥çÂÂ表ä¸ÂçÂÂå 容ï¼Â
mysql> select * from user_infos;
æÂ¥çÂÂ表ç»ÂæÂÂï¼Â
mysql> desc user_infos;
æ¥询ï¼Â
å¨main.go主å½æ°ä¸ÂÃ¥ÂÂå ¥ï¼Â
var u UserInfo //æ°建ä¸Â个表ä¸ÂÃ¥ÂÂéÂÂu
db.First(&u) //æ¥询表ä¸ÂçÂÂ第ä¸Âæ¡æ°æ®ä¿ÂÃ¥ÂÂå°uä¸Â
fmt.Printf("u:%#v\n", u) //è¾Âåºæ¾示
è¿Âè¡ÂÃ¥ÂÂï¼Â
æ´æ°ï¼Â
db.Model(&u).Update("hobby", "Ã¥ÂÂè²çÂÂ")
è¿Âè¡ÂÃ¥ÂÂï¼Â
å é¤ï¼Â
db.Delete(&u)
ç»ÂæÂÂ为ï¼Â
好äºÂï¼Âä»Â天æÂÂ就讲è¿Âä¹Âå¤Âï¼Âå¸ÂæÂÂè½å¤Â帮å©å°你ï¼Âå¦ÂæÂÂä½ è§Âå¾ÂæÂÂ帮å©ï¼Âä¹Âå¸ÂæÂÂè½å¤Âç»ÂæÂÂç¹ç¹èµÂ~~~
Ã¥ÂÂèÂÂå¦习è§Âé¢Âç½Âç«Âï¼Â
1.
www.bilibili.com/video/BV1Rdâ¦
2.
www.bilibili.com/video/BV1gJâ¦
3.
GORMÃ¥Â
¥é¨æÂÂå | æÂÂæÂÂå¨çÂÂÃ¥ÂÂ客 (liwenzhou.com)