本系列使用的开发环境如下:
在本小节中,首先在项目中完成了gin框架的导入,并编写了helleworld进行测试,然后导入gorm包,并将gorm和gin联合起来开发了一个简单的注册逻辑。
在goland中创建gin_test项目,并创建main.go文件
进入上节中创建的gin_test目录中,输入如下命令
go get -u github.com/gin-gonic/gin
注意,这里可能会遇到超时错误,这是因为包被墙了,我们可以对GO环境进行配置来解决这个问题,具体可看博主的另一篇文章go module配置。
安装完后,我们可以在go.mod中看到很多gin依赖。
在main.go文件中输入如下代码:
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
运行后,进入http://localhost:8080/ping可以看到pong消息。
在gin_test目录下运行如下命令:
go get -u gorm.io/gorm
这里我们使用的是mysql,所以还要包含如下包:
go get gorm.io/driver/mysql
我们编写以下的一个简单代码来进行测试,代码中定义了一个user结构体,将会映射成为数据库中的表,并基于此表进行了一些增删改查的操作:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
//定义结构体到数据库的映射,设置name为非空且唯一
type User struct {
gorm.Model
Name string `gorm:"not null;unique"`
Telephone string
Password string
}
func main() {
db:=InitDb()
//自动创建数据表
db.AutoMigrate(&User{})
db.Create(&User{Name: "yzy",
Password: "123456"})
var user User
fmt.Print(user)
fmt.Printf("----------\n")
db.First(&user,"name=?","yzy")
fmt.Print(user)
fmt.Printf("----------\n")
}
func InitDb() *gorm.DB{
//一些数据库的参数
username:="root"
password:="123456"
host:="localhost"
port:="3306"
charset:="utf8"
database:="test" //使用test数据库
dns:=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",
username,
password,
host,
port,
database,
charset)
//后面还可以传入一些对数据库特殊的定义
db,err:=gorm.Open(mysql.Open(dns))
if err != nil {
panic("failed to connect database,err:"+err.Error())
}
return db
}
在运行前别忘记开启数据库服务并创建代码中指定的数据库。
net start mysql
//进入mysql
mysql -u root -p
//创建数据库
creat database test
运行后查询数据库
select * from users;
代码如下:
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
gorm.Model
Name string
Telephone string `gorm:"unique;not null"`
Password string `gorm:"not null"`
}
func main(){
db:=InitDb()
db.AutoMigrate(&User{})
router:=gin.Default()
router.GET("/register",Register)
router.Run()
}
func Register(c *gin.Context){
db:=InitDb()
//获取数据
name:=c.Query("name")
password:=c.Query("password")
telephone:=c.Query("telephone")
if len(telephone)!=11{
c.JSON(400,gin.H{
"error":"the telephone is not correct",
})
return
}
//判断
if isTelephoneExist(db,telephone){
c.JSON(400,gin.H{
"error":"the telephone is already exit",
})
return
}
//插入数据
db.Create(&User{Name: name,Password: password,Telephone: telephone})
c.JSON(200,gin.H{
"msg":"succeed",
})
return
}
func isTelephoneExist(db *gorm.DB,telephone string)bool{
var user User
db.Where("password=?",telephone).First(&user)
if user.ID!=0{
return true
}else{
return false
}
}
func InitDb()*gorm.DB{
username:="root"
password:="123456"
database:="gin_demo"
charset:="utf8"
port:="3306"
host:="localhost"
dns:=fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True",
username,
password,
host,
port,
database,
charset)
db,err:=gorm.Open(mysql.Open(dns))
if err != nil {
panic("can't connect to the mysql"+err.Error())
}
return db
}
今天实现的一个小demo所有功能都写在一个包中,在业务扩大后,这样的架构就会显得十分臃肿不好维护,因为接下来将会对项目架构进行重新设计。