1. 配置数据库
bash
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
#配置表结构
type User struct {
ID int64 `json:"id" gorm:"primary_key"` // 主键ID自增长
Username string
Password string
}
#配置连接接信息
func main() {
//
dsn := "root:zhangfan@123@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
// err == nil 说明 连接成功
if err != nil {
panic("连接数据库失败")
}
}
2.创建表
go
func main() {
//
dsn := "root:zhangfan@123@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
// err == nil 说明 连接成功
if err != nil {
panic("连接数据库失败")
}
// 1.自动创建表
db.AutoMigrate(&User{})
3.增加数据
go
db.Create(&User{
Username: "lisi",
Password: "123456",
})
4.查询数据
go
//4.查询
//单个查询
u := User{ID: 1}
db.First(&u) //过滤其中一条
fmt.Printf("%#v\n", u)
// 查询所有数据
users := []User{} // 创建一个切片
db.Find(&users) // 查询并将结果填充到 users 切片中
fmt.Printf("%#v\n", users) // 使用 %#v 格式化动词打印 users 切片的内容,包括类型信息和值
5.删除数据
bash
//5.删除
// db.Delete(&User{ID: 2}) // 根据主见 删除 id 为 2 的用户
// 条件删除
db.Where("username = ?", "lisi").Delete(&User{})
6.创建一对多数据表
go
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// 2.定义一个User表
type User struct {
gorm.Model
Username string `json:"username" gorm:"column:username"`
//添加外键关联
CreditCards []CreditCard
}
// 3.定义一个card表
type CreditCard struct {
gorm.Model // gorm.Model包含了ID,CreatedAt,UpdatedAt,DeletedAt
Number string
UserID uint //这个就是与User表进行关联的外键 结构体+主键就是表关联的外键
}
func main() {
// 1. 连接数据库
dsn := "root:zhangfan@123@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
fmt.Println(db)
db.AutoMigrate(User{}, CreditCard{}) //自动创建表结构
6.1 创建一对多数据
创建了一个zhangfan用户并插入两条数据
go
user := User{
Username: "zhangfan",
CreditCards: []CreditCard{ // 创建一个切片
{Number: "0001"},
{Number: "0002"},
},
}
db.Create(&user)
6.1 插入一对多数据
go
//给zhangfan添加一条信用卡数据
u := User{Username: "zhangfan"}
db.First(&u)
db.Model(&u).Association("CreditCards").Append(&CreditCard{Number: "0003"})
6.2 一对多数据关联查询
查询两次
go
// 查询关联数据,先查到用户,在根据用户ID查询关联的card数据
u := User{Username: "zhangfan"}
db.First(&u) //查询user表的数据
fmt.Printf("%#v\n", u.Username)
err := db.Model(&u).Association("CreditCards").Find(&u.CreditCards)
if err != nil {
fmt.Println(err, "err")
}
//fmt.Println(u)
strUser, _ := json.Marshal(&u)
fmt.Println(string(strUser))
一次性查找
go
//预加载查询 通过 preload方法一对多查询
users := []User{}
db.Preload("CreditCards").Find(&users)
strUser, _ := json.Marshal(&users)
fmt.Println(string(strUser))
}

6.创建多对多数据表操作
go
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 1. 连接数据库
dsn := "root:zhangfan@123@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
fmt.Println(db)
// 创建表
db.AutoMigrate(user{}, Language{})
}
// 定义多对多表结构
type user struct {
gorm.Model
Language []Language `gorm:"many2many:user_languages;"` // 定义多对多关系
}
type Language struct {
gorm.Model
Name string
}
