GORM 是一个功能强大的 Go 语言对象关系映射(ORM)库,提供了简单易用的接口来操作数据库表,广泛应用于 Go 项目的开发中。本文将带你了解如何使用 GORM 连接数据库,并实现基本的增删改查(CRUD)操作。
1. 环境准备
安装 GORM 和数据库驱动
在使用 GORM 之前,需要安装 GORM 以及对应的数据库驱动。以 MySQL 为例,执行以下命令安装:
bash
复制代码
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
如果使用其他数据库,例如 PostgreSQL 或 SQLite,只需替换相应的驱动包即可。
初始化数据库
在 MySQL 中创建一个示例数据库 gorm_demo,并添加一张名为 users 的表:
sql
复制代码
CREATE DATABASE gorm_demo;
USE gorm_demo;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
2. 使用 GORM 连接数据库
以下是一个简单的数据库连接示例:
go
复制代码
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
func main() {
// 数据库连接配置
dsn := "username:password@tcp(127.0.0.1:3306)/gorm_demo?charset=utf8mb4&parseTime=True&loc=Local"
// 使用 GORM 连接数据库
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}
fmt.Println("Database connected successfully!")
// 继续你的操作...
}
注意:将 username 和 password 替换为实际的 MySQL 用户名和密码。
3. 定义模型结构
在 GORM 中,每张表对应一个结构体。以下是 users 表对应的模型:
go
复制代码
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100;not null"`
Age int `gorm:"not null"`
CreatedAt string
UpdatedAt string
}
4. 实现增删改查操作
自动迁移表结构
在操作数据库之前,可以使用 GORM 的自动迁移功能同步表结构:
go
复制代码
err = db.AutoMigrate(&User{})
if err != nil {
log.Fatalf("Failed to migrate database: %v", err)
}
增加数据
以下代码展示如何向 users 表中插入数据:
go
复制代码
func createUser(db *gorm.DB) {
user := User{Name: "Alice", Age: 25}
result := db.Create(&user)
if result.Error != nil {
log.Printf("Failed to create user: %v", result.Error)
} else {
fmt.Printf("User created successfully: %+v\n", user)
}
}
查询数据
使用 GORM 查询 users 表中的数据:
go
复制代码
func queryUsers(db *gorm.DB) {
var users []User
result := db.Find(&users)
if result.Error != nil {
log.Printf("Failed to query users: %v", result.Error)
} else {
fmt.Printf("Users found: %+v\n", users)
}
}
更新数据
更新用户信息可以使用以下方法:
go
复制代码
func updateUser(db *gorm.DB, id uint) {
var user User
if err := db.First(&user, id).Error; err != nil {
log.Printf("User not found: %v", err)
return
}
user.Name = "Updated Name"
user.Age = 30
if err := db.Save(&user).Error; err != nil {
log.Printf("Failed to update user: %v", err)
} else {
fmt.Printf("User updated successfully: %+v\n", user)
}
}
删除数据
通过主键 ID 删除用户:
go
复制代码
func deleteUser(db *gorm.DB, id uint) {
if err := db.Delete(&User{}, id).Error; err != nil {
log.Printf("Failed to delete user: %v", err)
} else {
fmt.Printf("User with ID %d deleted successfully\n", id)
}
}
5. 整体程序示例
将所有功能整合到一个程序中,完整代码如下:
go
复制代码
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100;not null"`
Age int `gorm:"not null"`
CreatedAt string
UpdatedAt string
}
func main() {
dsn := "username:password@tcp(127.0.0.1:3306)/gorm_demo?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 {
log.Fatalf("Failed to migrate database: %v", err)
}
// 增删改查操作
createUser(db)
queryUsers(db)
updateUser(db, 1)
deleteUser(db, 1)
}
func createUser(db *gorm.DB) {
user := User{Name: "Alice", Age: 25}
result := db.Create(&user)
if result.Error != nil {
log.Printf("Failed to create user: %v", result.Error)
} else {
fmt.Printf("User created successfully: %+v\n", user)
}
}
func queryUsers(db *gorm.DB) {
var users []User
result := db.Find(&users)
if result.Error != nil {
log.Printf("Failed to query users: %v", result.Error)
} else {
fmt.Printf("Users found: %+v\n", users)
}
}
func updateUser(db *gorm.DB, id uint) {
var user User
if err := db.First(&user, id).Error; err != nil {
log.Printf("User not found: %v", err)
return
}
user.Name = "Updated Name"
user.Age = 30
if err := db.Save(&user).Error; err != nil {
log.Printf("Failed to update user: %v", err)
} else {
fmt.Printf("User updated successfully: %+v\n", user)
}
}
func deleteUser(db *gorm.DB, id uint) {
if err := db.Delete(&User{}, id).Error; err != nil {
log.Printf("Failed to delete user: %v", err)
} else {
fmt.Printf("User with ID %d deleted successfully\n", id)
}
}
6. 结语
GORM 提供了丰富的功能,使得操作数据库变得简单高效。通过本文的学习,你已经掌握了如何连接数据库、定义模型并实现基本的增删改查操作。在实际项目中,可以进一步学习 GORM 的高级功能,例如事务处理、预加载关联数据等,以满足更复杂的需求。