什么是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复杂。
个人建议仅供参考
- 接收一个