1.安装依赖
(1)安装GORM框架
go get -u gorm.io/gorm
(2)安装不同的数据库驱动(根据实际情况选择)
go get -u gorm.io/driver/mysql
go get -u gorm.io/driver/postgres
go get -u gorm.io/driver/sqlite
go get -u gorm.io/driver/sqlserver
2.示例(以mysql为例)
注意:除了连接数据库的操作,其余操作对于所有GORM支持的数据库是通用的。
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// 数据库连接设置
var (
UserName = "root"
Password = "123456"
Host = "localhost" //本地数据库地址
Port = "3306" //默认端口
DBName = "db01"
)
// 定义数据库表的字段
type User struct {
ID int `gorm:"primaryKey"` // 主键字段,GORM 会自动识别
Name string // 用户名字段
Age int // 年龄字段
Email string // 邮箱字段
}
// 初始化数据库连接
func InitDB() (*gorm.DB, error) {
// 数据源名称,包含用户名、密码、数据库名等信息
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
UserName, Password, Host, Port, DBName)
// 连接数据库
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
return nil, err
}
return db, nil
}
// 根据 ID 查询用户
func QueryUser(db *gorm.DB, id int) (*User, error) {
var user User // 创建一个 User 变量用于存放查询结果
// db.First() 根据主键查找用户,找到的第一个记录会赋值给 user
err := db.First(&user, id).Error
return &user, err
}
// 根据年龄查询多个用户
func QueryUsers(db *gorm.DB, age int) ([]User, error) {
var users []User // 创建一个切片,用于存放查询到的多个用户
// db.Where() 构造查询条件,db.Find() 执行查询并将结果赋值给 users
err := db.Where("age = ?", age).Find(&users).Error
return users, err
}
func main() {
db, err := InitDB() // 初始化数据库连接
if err != nil {
fmt.Println("Database connection failed:", err)
return
}
// 进行数据库迁移,即将结构体转换为数据库中的表,
// 表名为结构体名小写+s
if err := db.AutoMigrate(&User{}); err != nil {
fmt.Println("Database migration failed:", err)
return
}
// 创建新用户
newUser := &User{Name: "Alice", Age: 25,
Email: "alice@example.com"} // 创建用户对象
// db.Create() 会将 user 对象插入到数据库中
if err := db.Create(newUser).Error; err != nil {
fmt.Println("Error creating user:", err)
return
}
// 查询用户
user, err := QueryUser(db, newUser.ID) // 根据新用户的 ID 查询
if err != nil {
fmt.Println("Error querying user:", err)
return
}
fmt.Println("Queried User:", user) // 打印查询结果
// 查询多个用户
users, err := QueryUsers(db, 25) // 查询年龄为 25 的用户
if err != nil {
fmt.Println("Error querying users:", err)
return
}
fmt.Println("Users with age 25:", users) // 打印查询到的用户列表
// 更新用户信息
user.Age = 26 // 修改用户年龄
// db.Save() 会根据主键更新用户信息
if err := db.Save(user).Error; err != nil {
fmt.Println("Error updating user:", err)
return
}
// 删除用户
// db.Delete() 根据主键删除用户记录
if err := db.Delete(&User{}, user.ID).Error; err != nil {
fmt.Println("Error deleting user:", err)
return
}
fmt.Println("User deleted successfully.")
}
3.CURD总结
C:Create(增加),U:Update(更新),R:Read(查询),D:Delete(删除)
db.Create(newUser)//增加新对象,newUser是结构体指针
db.Save(user)//更新指定对象,user是结构体指针
db.First(&user, id)//根据主键查询单个对象
db.Where("age = ?", age).Find(&users)//按条件查询多个对象,注意users是切片
db.Delete(&User{}, user.ID)//根据主键删除单个对象
注意:查询操作必须传入指针才能获取结果,其他操作也建议传入指针。