GORM 操作 SQLite 数据详解
本文记录了如何使用 GORM 操作 SQLite 数据库的完整方法,适合初学者和有经验的开发者参考。
初始化项目
- 确保安装了 Go 编译器。
- 使用
go mod init <项目名>
初始化项目。 - 安装 GORM 和 SQLite 的依赖:
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
基础操作代码示例
以下是一个完整的例子,涵盖了 GORM 操作 SQLite 数据库的初始化、模型定义、CRUD(增删改查)操作。
main.go 示例
package main
import (
"gorm.io/driver/sqlite" // 引入 SQLite 驱动
"gorm.io/gorm" // 引入 GORM 库
"log"
)
// 定义用户模型
// GORM 会自动根据 struct 名称生成表名(默认是复数形式 "users")
type User struct {
ID uint `gorm:"primaryKey"` // 主键
Name string // 用户名
Email string // 邮箱
Password string // 密码
}
func main() {
// 初始化数据库连接
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
log.Fatalf("连接数据库失败: %v", err)
}
log.Println("数据库连接成功")
// 自动迁移 - 根据模型创建或更新表结构
db.AutoMigrate(&User{})
log.Println("数据库迁移成功")
// 创建记录
newUser := User{Name: "张三", Email: "[email protected]", Password: "123456"} // 创建一个新用户实例
result := db.Create(&newUser) // 插入到数据库
if result.Error != nil {
log.Fatalf("插入记录失败: %v", result.Error)
}
log.Printf("记录插入成功,ID: %d", newUser.ID)
// 查询记录
var user User
db.First(&user, "email = ?", "[email protected]") // 根据条件查询用户
log.Printf("查询到用户: %+v", user)
// 更新记录
user.Name = "李四" // 修改用户名称
updateResult := db.Save(&user) // 保存更改
if updateResult.Error != nil {
log.Fatalf("更新记录失败: %v", updateResult.Error)
}
log.Println("记录更新成功")
// 删除记录
deleteResult := db.Delete(&user) // 删除该用户
if deleteResult.Error != nil {
log.Fatalf("删除记录失败: %v", deleteResult.Error)
}
log.Println("记录删除成功")
}
代码解析
数据库连接
- 使用
gorm.Open(sqlite.Open("test.db"))
初始化 SQLite 数据库,test.db
是数据库文件的名称,如果不存在会自动创建。
- 使用
自动迁移
db.AutoMigrate(&User{})
会根据模型User
自动创建或更新数据库中的表结构。
CRUD 操作
- 创建记录:使用
db.Create(&newUser)
创建新用户。 - 查询记录:使用
db.First()
或db.Find()
方法进行查询。 - 更新记录:修改模型字段后调用
db.Save(&user)
保存更新。 - 删除记录:调用
db.Delete(&user)
删除数据。
- 创建记录:使用
运行程序
将代码保存为 main.go
,运行:
go run main.go
程序会依次执行数据库连接、表结构迁移、插入记录、查询记录、更新记录和删除记录。
注意事项
表名生成规则
- 默认情况下,GORM 会将模型名称的复数形式作为表名。如果需要自定义表名,可以在模型定义中使用
TableName()
方法:
- 默认情况下,GORM 会将模型名称的复数形式作为表名。如果需要自定义表名,可以在模型定义中使用
func (User) TableName() string {
return "custom_users" // 自定义表名
}
日志级别
- GORM 支持配置日志级别以方便调试:
import "gorm.io/gorm/logger"
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info), // 设置日志级别为 Info
})
事务支持
- GORM 支持事务操作,可以使用
db.Transaction()
方法封装事务逻辑。例如:
- GORM 支持事务操作,可以使用
func performTransaction(db *gorm.DB) error {
return db.Transaction(func(tx *gorm.DB) error {
// 创建一个用户
if err := tx.Create(&User{Name: "王五", Email: "[email protected]", Password: "password"}).Error; err != nil {
return err // 回滚事务
}
// 查询用户记录
var user User
if err := tx.First(&user, "email = ?", "[email protected]").Error; err != nil {
return err // 回滚事务
}
// 删除用户
if err := tx.Delete(&user).Error; err != nil {
return err // 回滚事务
}
return nil // 提交事务
})
}
func main() {
// 初始化数据库连接
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
log.Fatalf("连接数据库失败: %v", err)
}
// 执行事务
if err := performTransaction(db); err != nil {
log.Fatalf("事务执行失败: %v", err)
}
log.Println("事务执行成功")
}
- 事务操作的优点:可以确保多个数据库操作要么全部成功,要么全部失败,从而保持数据一致性。
数据验证
- 使用 GORM 钩子函数(如
BeforeCreate
、BeforeUpdate
)实现数据验证或自定义逻辑。
- 使用 GORM 钩子函数(如