gorm.DB
时间: 2025-05-27 09:51:51 浏览: 13
### GORM 的基本使用方法及示例
GORM 是一种强大的 ORM 库,用于简化 Go 语言中的数据库操作。以下是关于其核心功能的详细介绍以及一些实际使用的代码示例。
#### 安装 GORM 和驱动程序
要安装 GORM 及 SQLite 驱动程序,可以运行以下命令:
```bash
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
```
这一步骤会将必要的依赖项下载到项目中[^1]。
---
#### 连接数据库并初始化配置
连接数据库时可以通过 `gorm.Open` 方法完成,并可传递自定义配置参数。例如:
```go
package main
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func initDB() (*gorm.DB, error) {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
SingularTable: true,
TablePrefix: "app_",
},
})
if err != nil {
return nil, err
}
return db, nil
}
```
上述代码展示了如何设置表名前缀 (`app_`) 并启用单数表名模式[^2]。
---
#### 创建模型结构体
在 GORM 中,通常通过定义结构体来表示数据库表及其字段。例如:
```go
type User struct {
ID uint `json:"id"`
Name string `json:"name" gorm:"size:100;not null"`
Email string `json:"email" gorm:"uniqueIndex;not null"`
}
// 自动迁移创建表
db.AutoMigrate(&User{})
```
此部分演示了如何利用标签指定字段属性,如大小限制、唯一索引等。
---
#### 查询数据
执行简单的查询操作如下所示:
```go
var user User
if result := db.First(&user, 1); result.Error != nil {
panic(result.Error)
} else {
fmt.Println(user.Name)
}
```
这段代码尝试查找 ID 为 1 的记录;如果找不到,则返回错误信息。
对于复杂查询场景(比如涉及多张表),可以借助 Joins 方法实现联结查询。例如获取特定玩具名称对应的儿童列表:
```go
type Child struct {
gorm.Model
Name string
Toys []Toy `gorm:"foreignKey:ChildID"`
}
type Toy struct {
gorm.Model
Name string
ChildID uint
}
func GetChildrenWithSpecificToy(toyName string) ([]Child, error) {
var children []Child
err := db.Preload("Toys").
Joins("LEFT JOIN toys ON toys.child_id = children.id").
Where("toys.name = ?", toyName).
Find(&children).Error
return children, err
}
```
这里结合 Preload 加载关联数据的同时还加入了额外过滤条件[^3]。
---
#### 插入新纪录
向数据库插入一条新的用户记录可通过 Create 方法轻松达成:
```go
newUser := User{Name: "Alice", Email: "[email protected]"}
result := db.Create(&newUser)
if result.Error != nil {
log.Fatalf("Failed to create record: %v\n", result.Error)
}
fmt.Printf("Newly created user's id is %d.\n", newUser.ID)
```
成功后即可获得刚生成的对象实例连同主键值一起返回。
---
#### 更新现有条目
更新已有实体的方法之一就是调用 Save 或 Updates 函数:
```go
updateResult := db.Model(&user).Update("Name", "Bob")
if updateResult.RowsAffected == 0 {
log.Println("No rows were updated.")
}
```
注意区别在于前者会覆盖整个对象而后者仅修改指定字段。
---
#### 删除记录
最后删除某条记录也很简单:
```go
deleteRes := db.Delete(&user)
if deleteRes.RowsAffected > 0 {
log.Println("Record successfully deleted!")
}
```
确认影响行数大于零即代表删除成功。
---
阅读全文
相关推荐















