这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
环境搭建
1.引入GORM
首先使用快速开始的代码进行修改
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
2.引入Gin框架
在进行数据库的连接之前,先创建UserBasic结构体,设计其中所需要的字段,为了之后的测试,如下:(新建models文件夹,在文件夹下新建user_basic.go)
而后创建test测试文件,在golang中需要使用一些驱动包来对指定数据库进行操作,比如MySQL需要使用
github.com/go-sql-driver/mysql库,而Sqlite需要使用github.com/mattn/go-sqlite3库来支持,不过好在gorm框架中对各个驱动包进行了简单包装,可以让我们在写程序时可以更方便的管理驱动库。
注意:gorm框架只是简单封装了数据库的驱动包,在安装时仍需要下载原始的驱动包。
在pkg.go.dev/ 中查询gin的框架的使用
$ go get -u github.com/jinzhu/gorm
$ go get -u github.com/go-sql-driver/mysql
主要步骤
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}
整体框架
//MySQL框架
package main
import (
"fmt"
"gochat/models"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type Product struct {
gorm.Model
Code string
Price uint
}
func main() {
db, err := gorm.Open(mysql.Open("root:密码@tcp(127.0.0.1:3306)/ginchat?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 迁移 schema
db.AutoMigrate(&models.UserBasic{})
// Create
//注意这里需要自己创建用户,以便后续的使用
user := &models.UserBasic{}
user.Name = "小明"
db.Create(user)
// Read
// var product Product
// db.First(&product, 1) // 根据整型主键查找
// db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
fmt.Println(db.First(user,1))
// Update - 将 product 的 price 更新为 200
db.Model(user).Update("PasWord", 密码)
// Update - 更新多个字段
// db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
// db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
// Delete - 删除 product
// db.Delete(&product, 1)
}
3.将数据和请求关联起来
- 在main方法里初始化配置文件以及数据库
utils.InitConfig()
utils.InitMySQL()
- 在config包里添加router.yml
mysql:
dns: root:33664399@tcp(127.0.0.1:3306)/ginchat?charset=utf8mb4&parseTime=True&loc=Local
- 新建utils包system_init.go
package utils
import (
"fmt"
"github.com/spf13/viper"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var DB *gorm.DB
func InitConfig() {
viper.SetConfigName("router")
viper.AddConfigPath("config")
err := viper.ReadInConfig()
if err != nil {
fmt.Println(err)
}
fmt.Println("config app:", viper.Get("app"))
}
func InitMySQL() {
DB, _ := gorm.Open(mysql.Open(viper.GetString("mysql.dns")), &gorm.Config{})
fmt.Println("config mysql:", viper.Get("mysql"))
}
- 到models包里面user_basic.go里面加上下面的方法
func GetUserList() []*UserBasic {
data := make([]*UserBasic, 10)
utils.DB.Find(&data)
for _,v := range data{
fmt.Println(v)
}
return data
}
- 到service包里面新建userservice.go
package service
import (
"gochat/models"
"github.com/gin-gonic/gin"
)
func GetUserList(c *gin.Context) {
data := make([]*models.UserBasic, 10)
data = models.GetUserList()
c.JSON(200, gin.H{
"message": data,
})
}
- 到router包的app.go
r.GET("/user/getUserList",service.GetUserList)