在 GORM 中使用外键涉及到在结构体定义中指定外键关系以及数据库迁移时的操作。下面是一个使用 GORM 定义外键的示例:

假设你有两个相关的表,一个是 User 表,另一个是 Order 表,每个订单属于一个用户。你想在 Order 表中添加一个外键,关联到 User 表的主键。以下是如何使用 GORM 定义这种关系:

package main

import (
	"fmt"
	"log"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

type User struct {
	ID   uint   `gorm:"primaryKey"`
	Name string
	Orders []Order
}

type Order struct {
	ID     uint `gorm:"primaryKey"`
	UserID uint
	Amount float64
}

func main() {
	dsn := "test.db"
	db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatal(err)
	}

	// 迁移数据库表
	db.AutoMigrate(&User{}, &Order{})

	// 创建一个用户和关联的订单
	user := User{
		Name: "Alice",
		Orders: []Order{
			{Amount: 100.0},
			{Amount: 200.0},
		},
	}
	db.Create(&user)

	// 查询用户和关联的订单
	var fetchedUser User
	db.Preload("Orders").First(&fetchedUser, user.ID)
	fmt.Printf("User: %s\n", fetchedUser.Name)
	for _, order := range fetchedUser.Orders {
		fmt.Printf("Order ID: %d, Amount: %f\n", order.ID, order.Amount)
	}
}

在上述示例中,User 模型拥有多个 Order 模型,通过 Orders 字段建立关联。Order 模型中的 UserID 字段用来存储外键关系。

在迁移数据库表时,GORM 会根据模型的关联关系自动创建外键。在查询用户时,使用 Preload 方法来预加载关联的订单信息。

需要注意的是,不同的数据库可能对外键的处理方式有所不同。上述示例使用的是 SQLite 数据库,其他数据库可能需要稍微不同的配置。在实际应用中,你需要根据使用的数据库类型进行适当的配置。


孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意