使用 GORM(Go 的 ORM 库)连接数据库
GORM 官方支持的数据库类型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB 安装 GORM 要安装 GORM,运行以下命令: sh复制代码go get -u gorm.io/gorm go get -u gorm.io/driver/mysql
这将安装 GORM 核心库以及 MySQL 驱动程序。 连接到数据库 首先,我们需要连接到数据库。这是一个使用 GORM 连接到 MySQL 数据库的例子:
package main
import ( "gorm.io/driver/mysql" "gorm.io/gorm" )
func main() { dsn := "user:password@tcp(localhost: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.Open() 函数连接到数据库。mysql.Open() 函数接受一个 DSN 字符串,其中包含数据库连接信息。 定义模型 GORM 使用结构体来表示数据库中的表。在这个例子中,我们将创建一个名为 User 的结构体来表示一个用户表: go复制代码type User struct { ID uint Name string Age int }
GORM 在处理数据库表名时使用了一种约定:它会将结构体名称转换为复数形式,并将其作为数据库表名。这是 GORM 的默认行为。所以,当您定义了一个名为 User 的结构体时,GORM 会自动将其映射到名为 users 的表。 这种约定起源于许多编程语言和框架中的一种惯例,即将表名表示为复数形式,以表示表中包含多个记录。 如果您想要自定义表名,可以在结构体中实现 GORM 的 Tabler 接口。这是一个示例: go复制代码type User struct { ID uint Name string Age int }
func (u User) TableName() string { return "custom_users" }
在这个例子中,我们实现了 TableName() 方法并返回了自定义的表名 "custom_users"。现在,GORM 将使用 "custom_users" 作为表名,而不是默认的 "users"。 GORM 将自动将结构体名称映射到相应的表名。在这种情况下,它将查找一个名为 users 的表。您还可以使用 GORM 标签来自定义字段和表名。 go复制代码type User struct { ID uint gorm:"column:id;primary_key" // 自定义字段名为 "id" 并设置为主键 Name string gorm:"column:name;type:varchar(100)" // 自定义字段名为 "name" 且设置为 VARCHAR 类型,最大长度 100 Age int gorm:"column:age;type:int;not null" // 自定义字段名为 "age" 且设置为 INT 类型,不允许为 NULL }
// 使用 TableName 方法自定义表名 func (User) TableName() string { return "custom_users" }
自动迁移 GORM 支持自动迁移,这意味着它可以自动创建和更新数据库表结构。要执行自动迁移,请调用 AutoMigrate() 函数: go复制代码db.AutoMigrate(&User{})
请注意,AutoMigrate() 函数不会删除表中的数据或删除未使用的列。 基本 CRUD 操作 插入记录 要插入新记录,可以使用 Create() 函数: go复制代码user := User{Name: "John Doe", Age: 25} result := db.Create(&user)
Create() 函数将新记录插入到数据库中,并更新结构体中的主键字段。 查询记录 要查询记录,可以使用 GORM 提供的各种查询方法,例如 First(),Find() 和 Where(): go复制代码// 查询单个记录 var user User result := db.First(&user, 1) // 使用主键查询 result := db.Where("name = ?", "John Doe").First(&user) // 使用条件查询
// 查询多个记录 var users []User result := db.Find(&users) // 查询所有用户记录 result := db.Where("age > ?", 25).Find(&users) // 使用条件查询多个记录
GORM 支持链式查询,您可以根据需要组合多个查询条件。 更新记录 要更新记录,可以使用 Save() 或 Updates() 函数: go复制代码// 更新单个记录 user := User{ID: 1, Name: "Jane Doe", Age: 30} result := db.Save(&user) // 使用主键更新记录
// 使用条件更新多个记录 result := db.Model(&User{}).Where("age > ?", 25).Updates(User{Name: "Updated Name"})
Save() 函数将使用主键更新记录,而 Updates() 函数可以更新一个或多个记录,具体取决于提供的条件。 删除记录 要删除记录,可以使用 Delete() 函数: go复制代码// 删除单个记录 user := User{ID: 1} result := db.Delete(&user) // 使用主键删除记录
// 使用条件删除多个记录 result := db.Where("age < ?", 18).Delete(&User{})
Delete() 函数可以删除一个或多个记录,具体取决于提供的条件。 详细api详解
- 查询 查询单个记录 go复制代码var user User
// 获取匹配条件的第一条记录 db.First(&user, 1) // 根据主键查询 db.Where("name = ?", "John Doe").First(&user) // 根据条件查询
// 获取匹配条件的任意一条记录 db.Take(&user) db.Where("name = ?", "John Doe").Take(&user)
// 获取匹配条件的最后一条记录 db.Last(&user) db.Where("name = ?", "John Doe").Last(&user)
查询多个记录 go复制代码var users []User
// 获取匹配条件的所有记录 db.Find(&users) db.Where("age > ?", 25).Find(&users)
条件查询 go复制代码var users []User
// 为查询添加条件 db.Where("name = ?", "John Doe").Find(&users)
// 为查询添加或条件 db.Where("name = ?", "John Doe").Or("name = ?", "Jane Doe").Find(&users)
// 为查询添加非条件 db.Not("name = ?", "John Doe").Find(&users)
排序、限制和偏移 go复制代码var users []User
// 对查询结果进行排序 db.Order("age desc").Find(&users)
// 限制查询结果的数量 db.Limit(5).Find(&users)
// 设置查询结果的偏移量 db.Offset(10).Find(&users)
- 插入 go复制代码user := User{Name: "John Doe", Age: 25} result := db.Create(&user)
- 更新 go复制代码// 更新单个记录 user := User{ID: 1, Name: "Jane Doe", Age: 30} result := db.Save(&user) // 使用主键更新记录
// 使用条件更新多个记录 result := db.Model(&User{}).Where("age > ?", 25).Updates(User{Name: "Updated Name"})
- 删除 go复制代码// 删除单个记录 user := User{ID: 1} result := db.Delete(&user) // 使用主键删除记录
// 使用条件删除多个记录 result := db.Where("age < ?", 18).Delete(&User{})
总结 易用性:GORM提供了简洁而强大的API,使得开发人员可以使用面向对象的方式进行数据库操作,而无需直接编写SQL语句。它采用了一种直观的语法,易于理解和使用。
数据库支持:GORM支持多种数据库,包括MySQL、PostgreSQL、SQLite等,可以轻松切换不同的数据库引擎而无需更改代码。
自动映射:通过定义Go语言的结构体来表示数据库中的表,GORM能够自动创建、修改和查询数据库。它使用一种约定优于配置的方式,将结构体字段与数据库表的列进行映射,简化了数据库操作的过程。
总而言之,GORM是一个功能丰富、易用的ORM库,它简化了Go语言中与数据库交互的过程。通过使用GORM,开发人员可以更方便地进行数据库操作,减少了编写SQL语句的工作量,并提高了开发效率和代码的可维护性。