gorm的基本使用
安装gorm和数据库驱动
首先我们要获取工具,我们可以通过命令下载,在goland中则可以直接图形化界面下载驱动即可
shell
代码解读
复制代码
在安装环境之后下一步就是在整个系统的初始化中连接数据库
连接
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
dsn := "username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
-
username:数据库用户名
-
password:数据库密码
-
host:数据库服务器的 IP 地址或域名
-
port:数据库服务器端口,MySQL 默认是
3306 -
dbname:要连接的数据库名称
-
charset=utf8mb4:设置字符编码,
utf8mb4支持表情符号 -
parseTime=True:将时间字段解析为 Go 的
time.Time类型 -
loc=Local:设置时区为本地时区
创建一个简单的 Go 项目,配置 GORM 以连接到 MySQL 数据库。
使用 GORM 时,需要定义与数据库表对应的结构体。以下是一个简单的 User 模型:
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
Email string `gorm:"unique"`
Password string
}
此结构体定义了一个 User 表,其中 ID 字段为主键,Name 和 Email 字段具有不同的约束
1. 创建
使用 Create 方法可以向数据库插入新记录。
result := db.Create(&newUser)
if result.Error != nil {
fmt.Println("创建用户失败:", result.Error)
} else {
fmt.Println("用户创建成功,ID:", newUser.ID)
}
2. 查询
// 查询 ID 为 1 的用户
result = db.First(&user, 1)
if result.Error != nil {
fmt.Println("查询用户失败:", result.Error)
} else {
fmt.Printf("查询到用户: %+v\n", user)
}
// 按条件查询
result = db.Where("email = ?", "alice@example.com").First(&user)
if result.Error != nil {
fmt.Println("按条件查询失败:", result.Error)
} else {
fmt.Printf("按条件查询结果: %+v\n", user)
}
3. 更新
使用 Save 或 Updates 方法可以更新数据库中的记录
user.Name = "Alice Smith"
result = db.Save(&user)
if result.Error != nil {
fmt.Println("更新用户失败:", result.Error)
} else {
fmt.Println("用户更新成功")
}
// 使用 Updates 方法批量更新
result = db.Model(&user).Updates(User{Name: "Alice Doe", Email: "alice.doe@example.com"})
if result.Error != nil {
fmt.Println("批量更新失败:", result.Error)
} else {
fmt.Println("批量更新成功")
}
4. 删除
使用 Delete 方法可以删除记录。
result = db.Delete(&User{}, 1)
if result.Error != nil {
fmt.Println("删除用户失败:", result.Error)
} else {
fmt.Println("用户删除成功")
}
GORM 常用特性
1. 钩子函数
GORM 支持在创建、更新、删除记录时触发钩子函数。常用钩子包括 BeforeCreate、AfterCreate、BeforeUpdate、AfterUpdate 等。
2. 事务处理
GORM 提供了对数据库事务的支持,适用于需要保证多步操作一致性的场景。
init函数与main函数
go语言中init函数用于package(包)的初始化,init函数是go语言一个重要特征。具有如下特性:
- init函数是用于程序执行前package的初始化的函数,比如初始化包里的变量、资源初始化等。
- 每个包可以拥有多个init函数,包的每个源文件也可以拥有多个init函数。
- 同一个包中多个init函数的执行顺序go语言没有明确的定义。
- 不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序。
- init函数不能被其他函数调用,而是在main函数执行之前(init执行顺序优于main函数),自动被调用。
main函数则是go程序的默认入口函数(主函数),与init函数具有以下区别: