1. GORM的安装
GORM 是Go语言的一个第三方库,用来操作数据库完成一系列操作,GORM的安装操作如下:
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
如果出现超时等一系列网络问题,可以使用如下命令进行安装(Windows系统):
$env:GO111MODULE = "on"
$env:GOPROXY = "https://goproxy.cn"
其他操作系统可以访问这里 ,里面有详细教程。
安装成功后的界面如下所示:
接下来写一个简单的go程序来看GORM是否可以使用。
package main
import (
"fmt"
"gorm.io/gorm"
"gorm.io/driver/mysql"
"log"
)
func main() {
dsn := "user: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.Fatalf("Failed to connect to database: %v", err)
}
fmt.Println(db)
log.Println("Database connected successfully!")
}
其中,dsn里面的三个参数名分别对应如下内容:
- user:mysql用户名;
- password:mysql密码;
- dbname:创建的数据库名称。
如果你的"gorm.io/gorm"这几行代码爆红,那么可以执行如下命令使其恢复正常(前提你使用的是GoLand):
go mod vendor
代码运行后的结果如下:
2.GORM的基本操作
2.1 创建
在数据库中创建一条记录的代码如下:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
// Table
type User struct {
ID uint
Name string
Age uint8
}
func main() {
dsn := "root:123456@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}
// 自动迁移
err = db.AutoMigrate(&User{})
if err != nil {
panic("failed to migrate")
}
// 通过结构体指针添加
user := User{Name: "Alice", Age: 22}
result := db.Create(&user)
fmt.Println(user.ID)
fmt.Println(result.Error)
fmt.Println(result.RowsAffected)
}
也可以使用Create函数创建多条记录:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
type User struct {
ID uint
Name string
Age uint8
}
func main() {
dsn := "root:123456@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}
err = db.AutoMigrate(&User{})
if err != nil {
panic("failed to migrate")
}
users := []User{
{Name: "Alice", Age: 19},
{Name: "Bob", Age: 22},
}
result := db.Create(users)
fmt.Println(result.Error)
fmt.Println(result.RowsAffected)
}
2.2 删除
删除记录时,需要确保主键字段有值,GORM 会通过主键去删除记录,如果主键为空,GORM 会删除该 model 的所有记录。
- 物理删除
db.Delete(&User{}, 10)
db.Delete(&User{}, []int{1, 2, 3})
2.3 更新数据
// 条件更新单个列
db.Model(&User{ID: 111}).Where("age > ?", 18).Update("name", "Bob")
// 更新多个列
db.Model(&User{ID: 111}).Updates(User{Name: "Bob", Age: 18})
2.4 查询数据
GORM 提供了 First、Take、Last 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误。
// 获取第一条记录
u := &User{}
db.First(u)
// 查询多条数据
users := make([]*User, 0)
result := db.Where("age > 10").Find(&users)
3. GORM总结
-
易用性
- 提供了直观的 API,开发者可以通过链式调用轻松进行数据库操作,无需手写复杂的 SQL 查询。
- 支持 Golang 的结构体与数据库表的映射,减少了手动配置的麻烦。
-
功能丰富
- 自动迁移(AutoMigrate): 能自动创建或更新数据库表结构。
- 关系支持: 支持一对一、一对多、多对多关系及关联操作。
- 查询构造: 提供丰富的查询选项(条件查询、分组、排序等)。
- 钩子(Hooks): 提供生命周期回调(如
BeforeSave、AfterCreate)以扩展功能。 - 事务支持: 提供便捷的事务管理。
-
高度可扩展
- 支持自定义模型、字段类型和方法。
- 可以轻松与其他第三方库集成,例如日志记录、数据验证等。
-
兼容性强
- 支持多种数据库(MySQL、PostgreSQL、SQLite、SQL Server 等)。
- 提供通用的接口,便于切换数据库驱动或在不同数据库之间迁移。
-
高性能
- 内部经过优化,减少了不必要的查询和操作,适合大多数应用场景。
- 支持连接池配置,提升高并发场景下的性能。
总之,GORM 是一个功能强大、易用且灵活的 ORM 框架,帮助开发人员提高了开发效率,减少了不必要的开发时间。