首先看原有的数据库配置 init.go,用于数据库初始化
conf.yaml 连接数据库的参数
我们可以看出数据库这段 YAML 代码定义了一个数据源名称(DSN),用于连接 MySQL 数据库。具体参数如下:
gorm:gorm
:用户名和密码。tcp(127.0.0.1:3306)
:数据库服务器地址和端口。/gorm
:数据库名称。charset=utf8mb4
:字符集。parseTime=True
:解析时间字段为时间类型。loc=Local
:时区设置为本地。
为了后期方便,这里采用另一种方式,根据传入的参数连接(动态连接),这种方式的好处就是便于后期的更改,如果之后想要更改连接的数据库或数据库的参数,只需要更改.env排至文件里的内容,而不是去conf文件夹内更改
mysql: dsn: "%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local"
mysql文件夹下的init.go使用.env中的配置的参数
然后,在docker中的配置中启用mysql
由于我的本地安装了mysql,并且使用的端口是3306,所以我将docker的数据库的3306映射到本地的3307来使用,同时.env使用的也是3307
注意 如果需要使用.env配置文件,需要在main.go中启用,这里需要用到 godotenv 来使 .env配置文件生效
我们可以使用gorm来测试一下
新建一个文件
package main
import (
// "fmt"
"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal"
"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/dal/mysql"
"github.com/cloudwego/biz-demo/gomall/demo/demo_proto/biz/model"
"github.com/joho/godotenv"
)
func main() {
err := godotenv.Load()
if err != nil {
panic(err)
}
dal.Init()
//CURD
// mysql.DB.Create(&model.User{Mail: "**********@qq.com", Password: "123456"})
// mysql.DB.Model(&model.User{}).Where("mail = ?", "**********@qq.com").Update("password", "654321")
// var row model.User
// mysql.DB.Model(&model.User{}).Where("mail = ?", "**********@qq.com").First(&row)
// fmt.Printf("row : %+v\n", row);
}
这里是创建user表
mysql.DB.Create(&model.User{Mail: "**********@qq.com", Password: "123456"})
这里是向user表中插入数据
mysql.DB.Model(&model.User{}).Where("mail = ?", "**********@qq.com").Update("password", "654321")
删除数据有两种类型,一种是软删除,一种是硬删除。
- 软删除:默认情况下,GORM 的 Delete 方法会执行软删除(即设置 deleted_at 字段为当前时间,而不是真正从数据库中删除记录)。如果表结构中没有 deleted_at 字段,则会真正删除记录。
mysql.DB.Where("mail = ?", "**********@qq.com").Delete(&model.User{})
- 硬删除:使用 Unscoped() 方法后,GORM 会忽略软删除机制,真正从数据库中删除记录,无论这些记录是否已经被软删除。
mysql.DB.Unscoped().Where("mail = ?", "**********@qq.com").Delete(&model.User{})
查询数据
查询数据可以使用 First
、Find
等方法。
查询单条记录
func GetUserByMail(mail string) (*model.User, error) {
var user model.User
result := mysql.DB.Where("mail = ?", mail).First(&user)
if result.Error != nil {
klog.Errorf("Failed to get user by mail: %v", result.Error)
return nil, result.Error
}
return &user, nil
}
查询多条记录
func GetAllUsers() ([]model.User, error) {
var users []model.User
result := mysql.DB.Find(&users)
if result.Error != nil {
klog.Errorf("Failed to get all users: %v", result.Error)
return nil, result.Error
}
return users, nil
}