GORM 是一个 Go 语言的 ORM 框架,它提供了方便的 API,使得开发者能够更加方便地操作数据库。以下是 GORM 的设计原理以及相应的代码示例。
- 结构体映射
GORM 通过结构体映射的方式来操作数据库。开发者只需要定义一个结构体,并在结构体上添加 GORM 的注解,就可以将结构体映射到对应的数据库表中。
type User struct {
ID uint `gorm:"primary_key"`
Name string `gorm:"column:name"`
Age int `gorm:"column:age"`
CreatedAt time.Time
UpdatedAt time.Time
}
- 数据库连接
GORM 支持多种数据库的连接,包括 MySQL、PostgreSQL、SQLite 等。开发者只需要在代码中指定对应的数据库类型和连接信息,就可以连接到数据库。
import "gorm.io/driver/mysql"
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 {
panic("failed to connect database")
}
- 数据库操作
GORM 提供了丰富的 API,使得开发者可以方便地进行数据库操作,包括增删改查、事务、分页等。以下是一些常用的 API 示例:
// 创建记录
user := User{Name: "张三", Age: 18}
db.Create(&user)
// 查询记录
var result User
db.First(&result, "name = ?", "张三")
// 更新记录
db.Model(&result).Update("age", 20)
// 删除记录
db.Delete(&result)
// 事务
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
tx.Create(&User{Name: "李四", Age: 20})
tx.Create(&User{Name: "王五", Age: 22})
tx.Commit()
// 分页
var users []User
db.Offset(10).Limit(20).Find(&users)
- 关联查询
GORM 支持多种关联查询方式,包括一对一、一对多、多对多等。开发者只需要在结构体上添加对应的注解,就可以进行关联查询。
type Product struct {
ID uint
Name string
UserID uint
User User `gorm:"foreignKey:UserID"`
}
var product Product
db.Preload("User").First(&product, 1)