使用 GORM 连接数据库并实现增删改查操作
一、什么是 GORM
GORM 是 Go 语言中功能强大的 ORM(对象关系映射)库,提供了对数据库操作的抽象层,支持主流数据库(如 MySQL、PostgreSQL、SQLite 等),同时具有灵活的查询构造和模型定义功能。
二、安装 GORM
确保已安装 Go 环境,使用以下命令安装 GORM 和其驱动程序(以 MySQL 为例):
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
三、基本配置
- 数据库连接
以下是使用 GORM 连接 MySQL 数据库的代码:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func initDB() error {
// 数据库连接配置
dsn := "username:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
return fmt.Errorf("failed to connect to database: %v", err)
}
fmt.Println("Database connected!")
return nil
}
func main() {
if err := initDB(); err != nil {
fmt.Println(err)
return
}
}
四、定义模型
在 GORM 中,模型是与数据库表对应的结构体。以下是一个用户表模型示例:
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100;not null"`
Email string `gorm:"unique;not null"`
Age int
CreatedAt time.Time
UpdatedAt time.Time
}
GORM 根据模型的字段标签定义数据库的表结构。
五、自动迁移(AutoMigrate)
使用 GORM 的自动迁移功能,根据模型定义生成或更新数据库表:
func main() {
if err := initDB(); err != nil {
fmt.Println(err)
return
}
// 自动迁移
if err := db.AutoMigrate(&User{}); err != nil {
fmt.Println("Failed to migrate database:", err)
return
}
fmt.Println("Database migrated!")
}
六、实现增删改查操作
- 创建记录(Create)
通过 Create 方法插入一条记录:
func createUser() {
user := User{
Name: "Alice",
Email: "alice@example.com",
Age: 25,
}
if err := db.Create(&user).Error; err != nil {
fmt.Println("Failed to create user:", err)
} else {
fmt.Println("User created:", user)
}
}
- 查询记录(Read)
查询单条记录:
func getUserByID(id uint) {
var user User
if err := db.First(&user, id).Error; err != nil {
fmt.Println("User not found:", err)
} else {
fmt.Println("User found:", user)
}
}
查询所有记录:
func getAllUsers() {
var users []User
if err := db.Find(&users).Error; err != nil {
fmt.Println("Failed to fetch users:", err)
} else {
fmt.Println("All users:", users)
}
}
- 更新记录(Update)
更新单个字段:
func updateUserEmail(id uint, newEmail string) {
if err := db.Model(&User{}).Where("id = ?", id).Update("email", newEmail).Error; err != nil {
fmt.Println("Failed to update user:", err)
} else {
fmt.Println("User email updated!")
}
}
更新多个字段:
func updateUser(id uint, updates map[string]interface{}) {
if err := db.Model(&User{}).Where("id = ?", id).Updates(updates).Error; err != nil {
fmt.Println("Failed to update user:", err)
} else {
fmt.Println("User updated!")
}
}
- 删除记录(Delete)
删除指定 ID 的记录:
func deleteUserByID(id uint) {
if err := db.Delete(&User{}, id).Error; err != nil {
fmt.Println("Failed to delete user:", err)
} else {
fmt.Println("User deleted!")
}
}
七、完整代码示例
以下是将上述功能整合的完整代码:
package main
import (
"fmt"
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100;not null"`
Email string `gorm:"unique;not null"`
Age int
CreatedAt time.Time
UpdatedAt time.Time
}
func initDB() error {
dsn := "username:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
return fmt.Errorf("failed to connect to database: %v", err)
}
fmt.Println("Database connected!")
return nil
}
func main() {
if err := initDB(); err != nil {
fmt.Println(err)
return
}
// 自动迁移
if err := db.AutoMigrate(&User{}); err != nil {
fmt.Println("Failed to migrate database:", err)
return
}
// 增删改查操作示例
createUser()
getUserByID(1)
getAllUsers()
updateUserEmail(1, "newalice@example.com")
deleteUserByID(1)
}
func createUser() {
user := User{
Name: "Alice",
Email: "alice@example.com",
Age: 25,
}
if err := db.Create(&user).Error; err != nil {
fmt.Println("Failed to create user:", err)
} else {
fmt.Println("User created:", user)
}
}
func getUserByID(id uint) {
var user User
if err := db.First(&user, id).Error; err != nil {
fmt.Println("User not found:", err)
} else {
fmt.Println("User found:", user)
}
}
func getAllUsers() {
var users []User
if err := db.Find(&users).Error; err != nil {
fmt.Println("Failed to fetch users:", err)
} else {
fmt.Println("All users:", users)
}
}
func updateUserEmail(id uint, newEmail string) {
if err := db.Model(&User{}).Where("id = ?", id).Update("email", newEmail).Error; err != nil {
fmt.Println("Failed to update user:", err)
} else {
fmt.Println("User email updated!")
}
}
func deleteUserByID(id uint) {
if err := db.Delete(&User{}, id).Error; err != nil {
fmt.Println("Failed to delete user:", err)
} else {
fmt.Println("User deleted!")
}
}
八、总结
- 简洁性:GORM 提供了简洁的 API 和灵活的查询方式。
- 高效开发:通过模型定义和自动迁移,快速构建数据库结构。
- 可扩展性:支持复杂查询和事务操作,适用于小型项目和大型系统。
使用 GORM,可以极大提高 Go 开发过程中与数据库交互的效率,同时保持代码的简洁和可维护性。