一、GORM
GORM 是一款功能强大且易用的 Go 语言的对象关系映射(ORM)库,它支持多种数据库,如 MySQL、PostgreSQL、SQLite 等。通过使用 GORM,开发者可以用更面向对象的方式来与数据库进行交互,而无需编写大量繁琐的原生 SQL 语句,大大提高了开发效率。接下来将详细介绍如何使用 GORM 连接数据库并实现基本的增删改查操作。
二、连接数据库
package main
import ( "gorm.io/driver/mysql" "gorm.io/gorm" )
func main() {
dsn := "root:your_password@tcp(127.0.0.1:3306)/test_database?charset=utf8mb4&parseTime=True&loc=Local"
var db *gorm.DB
var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err!= nil { panic("连接数据库失败:" + err.Error())
}
// 这里可以进行后续操作,比如自动迁移等
}
在上述代码中,dsn(Data Source Name)是用于配置连接数据库的字符串,里面包含了数据库连接所需的各种关键信息,如用户名、密码、主机地址、端口以及数据库名等。gorm.Open 函数用于根据指定的数据库驱动(这里是 mysql)和配置信息尝试建立与数据库的连接,如果连接出现错误,则会通过 panic 抛出异常提示连接失败。
三、定义数据模型
在使用 GORM 进行操作前,需要定义与数据库表对应的结构体(也就是数据模型)。例如,有一个简单的 User 表,包含 ID、Name、Age 三个字段,对应的结构体定义如下:
type User struct {
gorm.Model
Name string
Age int
}
这里使用了 gorm.Model,它包含了一些常用的基础字段,如 ID(主键,自增)、CreatedAt(创建时间)、UpdatedAt(更新时间)、DeletedAt(删除时间,用于软删除)等。如果不需要这些默认字段,可以不继承 gorm.Model,自己手动定义相应的字段。
四、操作
创建
func createUser(db *gorm.DB) {
user := User{
Name: "张三",
Age: 25,
}
err = db.Create(&user)
if err != nil {
panic("创建用户失败:" + err.Error())
}
// 插入成功后,user.ID 会被自动赋值为数据库中生成的主键值
println("用户创建成功,ID:", user.ID)
}
查询
查询单条记录
func getuserById(db *gorm.DB, id uint) {
var user User
err = db.First(&user, id).Error
if err != nil {
panic("查询用户失败:" + err.Error())
}
println("查询到的用户信息:", user.Name, user.Age)
}
这里使用 db.First 方法按照主键查找记录,并将查询结果赋值给 user 结构体变量,如果没找到对应的记录会返回相应的错误信息。
查询多条记录
如果要查询多条符合条件的记录,可以使用 Find 方法,例如查询所有年龄大于 20 岁的用户:
func getUsersByAge(db *gorm.DB) {
var users []User
err = db.Where("age >?", 20).Find(&users).Error
if result.Error!= nil {
panic("查询用户列表失败:" + err.Error())
}
for _, u := range users {
println("用户信息:", u.Name, u.Age)
}
}
通过 Where 子句添加查询条件,然后使用 Find 方法获取满足条件的所有记录,并将它们存储在 users 切片中。
更新
更新单条记录
func updateUserAge(db *gorm.DB, id uint, newAge int) {
err = db.Model(&User{}).Where("id =?", id).Update("age", newAge)
if err != nil {
panic("更新用户年龄失败:" + err.Error())
}
println("用户年龄更新成功")
}
批量更新记录
func batchUpdateUsers(db *gorm.DB) {
err = db.Model(&User{}).Where("age < 30").Update("age", gorm.Expr("age + 1"))
if err != nil {
panic("批量更新用户年龄失败:" + err.Error())
}
println("批量更新用户年龄成功")
}
这里使用 gorm.Expr 可以在更新语句中使用表达式来实现更复杂的更新逻辑。
删除
软删除
如果在数据模型中使用了 gorm.Model(也就是支持软删除功能),可以通过以下方式进行软删除,例如删除指定 ID 的用户
func softDeleteUser(db *gorm.DB, id uint) {
result := db.Delete(&User{}, id)
if result.Error!= nil {
panic("软删除用户失败:" + result.Error.Error())
}
println("用户软删除成功")
}
执行 Delete 操作后,对应的记录的 DeletedAt 字段会被设置为当前时间,在查询时默认不会查询出这些已经 “删除” 的记录。
硬删除
如果想要彻底从数据库中删除记录(即硬删除),需要添加额外的配置,禁用软删除功能,示例如下:
func hardDeleteUser(db *gorm.DB, id uint) {
db.Unscoped().Delete(&User{}, id)
// 这里可以添加错误处理逻辑等
}
通过 Unscoped 方法可以绕过软删除机制,直接从数据库中永久删除对应的记录。
以上介绍了如何使用 GORM 这个 Go 语言的 ORM 库连接数据库,并实现了增删改查这些基本的数据库操作。在实际开发中,GORM 还有很多强大的功能,比如关联查询、事务处理、自定义 SQL 等,可以根据具体的业务需求进一步深入学习和运用,从而高效地开发出与数据库交互的 Go 应用程序。