Gorm和数据库那些事一些简单的实践【又是一个小问题,折腾了我一天,总结下来一句话,如果你的问题百不出来,那就想想是不是自己忽略了什么】

什么是Gorm下面这段话来自Gorm

全功能 ORM

  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 Preload、Joins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To Saved Point
  • Context、预编译模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行
    CRUD
  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询 复合主键,索引,约束
  • Auto Migration
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  • 每个特性都经过了测试的重重考验
  • 开发者友好(我认为对开发者不是特别友好)

下面是一段代码的尝试,基于GinWeb的signup实现的代码

package repository

import (
	"fmt"
	"gorm.io/driver/mysql"
	_ "gorm.io/driver/mysql"
	"gorm.io/gorm"
	"net/url"
)

// WebUser 结构体代表网站用户的信息,包含ID、邮箱、密码等字段。
// 使用gorm.Model作为嵌入字段以利用GORM提供的基本字段和操作。
type WebUser struct {
	gorm.Model
	Email           string
	Password        string
	ConfirmPassword string
}

// MsqlInit 初始化MySQL数据库连接,并自动迁移WebUser模型的结构到数据库。
// 它通过URL编码密码来构建数据库的DSN(数据源名称),然后打开数据库连接,并进行自动迁移。
func MsqlInit() {
	passwd := "********"
	encodePaasswd := url.QueryEscape(passwd)
	dsn := fmt.Sprintf("root:%s@tcp(127.0.0.1:3306)/webuser?charset=utf8&parseTime=True&loc=Local", encodePaasswd)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}
	db.AutoMigrate(&WebUser{})
	CreateUser(db)
}

// CreateUser 在数据库中创建一个示例的WebUser记录。
// 它使用提供的数据库连接,创建一个具有固定邮箱和密码的WebUser实例,并插入到数据库中。
func CreateUser(db *gorm.DB) {
	db.Create(&WebUser{
		Email:           "******@163.com",
		Password:        "123456",
		ConfirmPassword: "123456",
	})
}

关于代码的一些解释

type WebUser struct {
	gorm.Model
	Email           string
	Password        string
	ConfirmPassword string
}

这一部分是定义了一个结构体,里面声明的字段,就是你的数据表里面的字段内容,当然这也是你在signup里面定义的需要用户输入的内容(小声逼逼一句,我在最开始实践的时候自定义了一些字段,导致一直没有在数据库里面写入成功,就是这点破玩意浪费了我好几个小时,我冤啊)

	passwd := "********.Zyw"
	encodePaasswd := url.QueryEscape(passwd)
	dsn := fmt.Sprintf("root:%s@tcp(127.0.0.1:3306)/webuser?charset=utf8&parseTime=True&loc=Local", encodePaasswd)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}
	db.AutoMigrate(&WebUser{})

这一部分是数据库登录的,主要涉及的是数据库的passwd包含特殊字符的写法,如果里面没有包含特殊字符,可以参考下面这一部分:

func main() {
        // 定义数据库的DSN(Data Source Name),包括用户名、密码、主机、端口和数据库名等信息
        dsn := "root:****@tcp(127.0.0.1:13306)/webook?charset=utf8mb4&parseTime=True&loc=Local"

        // 使用 GORM 开启 MySQL 数据库连接,并配置 GORM 的行为
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil {
                log.Fatal("failed to connect database", err)
        }

        // 自动迁移 Students 表的结构,根据结构体定义来创建或更新表
        db.AutoMigrate(&Students{})

下面是关于代码实现的过程

1.在main函数里面调用该位置的函数,来实现数据库的初始化和一些功能表的创建

func main() {
	// 初始化Gin框架的默认路由器
	hdl := handlers.NewUserHandlers()
	server := gin.Default()
	//db := repository.MsqlInit
	repository.MsqlInit()

“repository.MsqlInit()” 是关于刚才写的数据库的引用,然后运行main() 函数来执行操作,并登录数据库检查,是否能够创建成功。
在这里插入图片描述
通过上面的图片可以看出来,目前数据表已经创建成功,数据能够正常插入,这个仅用于实验,因为涉及到明文密码,以及密码策略的问题需要后续完善。

接下来是上面一整段代码的详细解释:

WebUser 结构体
  • 定义WebUser 结构体代表了网站用户的实体信息,包含了用户的基本属性如 ID, Email, Password, 和 ConfirmPassword 等字段。其中 gorm.Model 是一个嵌入类型,提供了 GORM 的标准字段,例如 ID, CreatedAt, UpdatedAt, DeletedAt 等,用于处理时间戳和软删除等操作。
MsqlInit 函数
  • 功能:初始化 MySQL 数据库连接并自动迁移 WebUser 模型的结构到数据库。
  • 步骤
    • 首先,将数据库密码通过 url.QueryEscape 进行 URL 编码,防止密码中的特殊字符引起问题。
    • 构建数据库的 DSN (Data Source Name),格式为 "root:<encoded_password>@tcp(127.0.0.1:3306)/webuser?charset=utf8&parseTime=True&loc=Local",其中 <encoded_password> 是经过编码的密码。
    • 使用 gorm.Open 打开数据库连接,传入 MySQL 驱动和 DSN 字符串。
    • 如果打开数据库连接时出现错误,则会调用 panic 函数终止程序。
    • 调用 db.AutoMigrate 自动迁移 WebUser 模型结构至数据库,确保数据库表结构与 WebUser 结构体一致。
    • 最后,调用 CreateUser 函数创建一个示例用户。
CreateUser 函数
  • 功能:在数据库中创建一个示例的 WebUser 记录。
  • 步骤
    • 接收一个 *gorm.DB 类型的参数 db,即数据库连接。
    • 创建一个 WebUser 结构体实例,设置其 Email, Password, 和 ConfirmPassword 字段的值。
    • 使用 db.Create 方法将该 WebUser 实例写入数据库。
      最后总结一下:如果说你会mysql的一些基本语句,尽量说写个sql吧,我感觉这个会比sql复杂。
      个人建议仅供参考
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值