简介
GORM 是一个使用 Go 语言编写的优秀 ORM(对象关系映射)库,它提供了一种简洁的方式来处理数据库操作,使得开发者可以用 Go 的方式来操作数据库,而不是直接编写 SQL 语句。GORM 支持多种数据库,包括 MySQL、PostgreSQL、SQLite 和 SQL Server。本文将详细介绍如何使用 GORM 连接数据库,并实现基本的增删改查(CRUD)操作。
环境准备
安装 GORM 和数据库驱动:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
连接数据库
首先,我们需要创建一个数据库连接。以下是使用 GORM 连接 MySQL 数据库的代码:
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
var db *gorm.DB
func init() {
var err error
// 替换为你的数据库配置
dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("Failed to connect to database: ", err)
}
}
gorm.Open(dsn, config): 连接数据库并返回一个*gorm.DB实例。dsn是数据源名称,包含了连接数据库所需的信息,config是一个*gorm.Config实例,用于配置 GORM 的行为。
定义模型
在进行 CRUD 操作之前,我们需要定义一个模型(Model),这个模型将映射到数据库中的一个表。以下是一个简单的用户模型:
type User struct {
gorm.Model
Name string
Email string `gorm:"type:varchar(100);uniqueIndex"`
}
gorm.Model: 一个内嵌的结构体,包含了模型的基本字段,如ID、CreatedAt、UpdatedAt、DeletedAt等。
自动迁移
GORM 提供了自动迁移(AutoMigrate)功能,可以自动创建或修改数据库表结构以匹配模型的定义:
func main() {
initDB()
// 自动迁移
db.AutoMigrate(&User{})
}
- `db.AutoMigrate(dst)`: 自动迁移方法,用于创建或修改数据库表结构以匹配模型的定义。`dst` 是要迁移的模型实例。
## 增删改查操作
### 创建(Create)
使用 `Create` 方法添加新记录:
```go
func CreateUser(name, email string) {
user := User{Name: name, Email: email}
result := db.Create(&user) // 使用 &user 传递指针
if result.Error != nil {
log.Fatal(result.Error)
}
}
读取(Read)
使用 Find 或 First 方法查询记录:
func GetUser(id uint) *User {
var user User
result := db.First(&user, id) // 根据 ID 查询
if result.Error != nil {
log.Fatal(result.Error)
}
return &user
}
更新(Update)
使用 Save 或 Update 方法更新记录:
func UpdateUser(id uint, name, email string) {
result := db.Model(&User{}).Where("id = ?", id).Updates(map[string]interface{}{"name": name, "email": email})
if result.Error != nil {
log.Fatal(result.Error)
}
}
删除(Delete)
使用 Delete 方法删除记录:
func DeleteUser(id uint) {
result := db.Delete(&User{}, id)
if result.Error != nil {
log.Fatal(result.Error)
}
}
db.Create(value): 创建记录,value是要创建的模型实例。db.Find(dest, conds): 查询多条记录,dest是存储查询结果的切片,conds是查询条件。db.First(dest, conds): 查询单条记录,dest是存储查询结果的变量,conds是查询条件。db.Take(dest, conds): 查询单条记录,类似于First,但是如果没有找到记录,Take会返回record not found错误。db.Last(dest, conds): 查询最后一条符合条件的记录。db.Update(column, value, conds): 更新记录,column是要更新的字段,value是更新的值,conds是更新条件。db.Updates(values, conds): 更新记录,values是一个包含多个字段和值的映射,conds是更新条件。db.Delete(valueOrSlice, conds): 删除记录,valueOrSlice是要删除的模型实例或切片,conds是删除条件。
高级查询
GORM 还支持更复杂的查询,如预加载(Preload)、事务(Transaction)、原生 SQL 查询等。
预加载(Preload)
go
func GetUserWithPosts(id uint) *User {
var user User
db.Preload("Posts").First(&user, id)
return &user
}
事务(Transaction)
go
func TransactionExample() {
tx := db.Begin()
if tx.Error != nil {
log.Fatal(tx.Error)
}
// 创建用户
if tx.Create(&User{Name: "John Doe"}).Error != nil {
tx.Rollback()
return
}
// 创建帖子
if tx.Create(&Post{Title: "Hello World"}).Error != nil {
tx.Rollback()
return
}
tx.Commit()
}
db.Begin(): 开启一个新的事务。tx.Commit(): 提交事务。tx.Rollback(): 回滚事务。
原生 SQL 查询
go复制
func RawSQLQuery() {
var users []User
db.Raw("SELECT * FROM users").Scan(&users)
}
db.Raw(sql, args...): 执行原生 SQL 查询,sql是 SQL 语句,args是查询参数。db.Exec(sql, args...): 执行原生 SQL 语句。
总结
本文介绍了如何使用 GORM 连接数据库,并实现了基本的 CRUD 操作。GORM 提供了丰富的功能和灵活的接口,使得数据库操作变得更加简单和高效。通过定义模型和使用 GORM 的方法,你可以轻松地与数据库进行交互。