使用go连接docker数据库 | 豆包MarsCode AI 刷题

43 阅读2分钟

首先看原有的数据库配置 init.go,用于数据库初始化

image.png

conf.yaml 连接数据库的参数 image.png

我们可以看出数据库这段 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中的配置的参数

image.png

image.png

然后,在docker中的配置中启用mysql

image.png

由于我的本地安装了mysql,并且使用的端口是3306,所以我将docker的数据库的3306映射到本地的3307来使用,同时.env使用的也是3307

注意 如果需要使用.env配置文件,需要在main.go中启用,这里需要用到 godotenv 来使 .env配置文件生效

image.png

我们可以使用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{})

查询数据

查询数据可以使用 FirstFind 等方法。

查询单条记录

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
}