Gorm 的数据完整性约束、一对一、一对多

GORM 高级使用

「一对多」关系

显性声明一对多关系

  • 字段类型为嵌套[]struct
  • 是否需要显性声明一对多关系,需要。否则会报错

[error] invalid field found for struct x.com/dto/xBillDetail's field ComponentSet: define a valid foreign key for relations or implement the Valuer/Scanner interface

示例

tag;定义 ForeignKey,指向子表的BillDetailID字段

go 复制代码
type QCloudBillDetail struct {
	gorm.Model 
	
	ComponentSet []QCloudBillDetailComponent `json:"componentSet,omitempty" name:"ComponentSet" gorm:"ForeignKey:BillDetailID"`

	Tags []QCloudBillTagInfo `json:"tags,omitempty" name:"Tags" gorm:"ForeignKey:BillDetailID"`
	
	PriceInfo QCloudPriceInfo `json:"priceInfo,omitempty" name:"PriceInfo" gorm:"type:json"`

}
  • ComponentSet 字段 嵌套 ComponentSet列表,需要指定ComponentSet的ID为主键
  • 未指定主键,会报错
    • [error] invalid field found for struct acmp-service/dto.XBillDetail's field ComponentSet: define a valid foreign key for relations or implement the Valuer/Scanner interface
    • 解决:增加主键
  • Tags字段 处理相同;增加主键
一对多 子表的主键设置
go 复制代码
type QCloudBillDetailComponent struct {
	gorm.Model 

	BillDetailID int64 `json:"billDetailID,omitempty" name:"BillDetailID" gorm:"type:varchar(16)"`

}
go 复制代码
type QCloudBillTagInfo struct {
	gorm.Model 
        
	BillDetailID int64 `json:"billDetailID,omitempty" name:"BillDetailID" gorm:"type:varchar(16)"`
}

「一对多」的另外一种形态[]string

  • PriceInfo字段;grom支持[]struct,也支持[]string;但不支持[]*string指针
  • 使用[]*string,会报错
    • got error unsupported data type: &[]
    • 解决:要么使用[]string;要么转换为[]struct
  • 且如果要使用[]string,是支持的,但
    • 需要创建实现 Valuer/Scanner 接口的自定义数据类型
通过实现Value、Scan方法
go 复制代码
import (
	"database/sql/driver"
)

type XPriceInfo []string 

func (s XPriceInfo) Value() (driver.Value, error) {
	// 序列化 `Strings` 为 JSON 字符串
	jsonString, err := json.Marshal(s)
	if err != nil {
	  return nil, err
	}
  
	// 返回 JSON 字符串
	return jsonString, nil
  }
  
  func (s *XPriceInfo) Scan(value interface{}) error {
	// 反序列化 JSON 字符串为 `Strings`
	jsonString, ok := value.([]byte)
	if !ok {
	  return errors.New("invalid type")
	}
  
	err := json.Unmarshal(jsonString, s)
	if err != nil {
	  return err
	}
  
	return nil
  }
[]string类型,在数据库类型为json

json类型字段

  • json类型字段,是否需要约束json字段长度。不能限定,否则会报错 PriceInfo QCloudPriceInfo json:"priceInfo,omitempty" name:"PriceInfo" gorm:"type:json"``

Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(32),PRIMARY KEY (id),INDEX idx_q_cloud_bill_details_deleted_at (`deleted_at' at line 1

声明grom类型json
  • PriceInfo字段指向 QCloudPriceInfo
go 复制代码
	PriceInfo QCloudPriceInfo `json:"priceInfo,omitempty" name:"PriceInfo" gorm:"type:json"`
        

「一对一」关系

字段为自定义类型 如struct

golang 复制代码
AssociatedOrder QCloudBillDetailAssociatedOrder `json:"associatedOrder,omitempty" name:"AssociatedOrder"`
go 复制代码
type QCloudBillDetailAssociatedOrder struct {
   gorm.Model

   BillDetailID int64 `json:"billDetailID,omitempty" name:"BillDetailID" gorm:"type:varchar(16)"`

   PrepayPurchase string `json:"prepayPurchase,omitempty" name:"PrepayPurchase" gorm:"type:varchar(16)"`

   PrepayRenew string `json:"prepayRenew,omitempty" name:"PrepayRenew" gorm:"type:varchar(16)"`

   PrepayModifyUp string `json:"prepayModifyUp,omitempty" name:"PrepayModifyUp" gorm:"type:varchar(16)"`

   ReverseOrder string `json:"reverseOrder,omitempty" name:"ReverseOrder" gorm:"type:varchar(16)"`

   NewOrder string `json:"newOrder,omitempty" name:"NewOrder" gorm:"type:varchar(16)"`

   Original string `json:"original,omitempty" name:"Original" gorm:"type:varchar(16)"`
}
struct类型,在数据库类型为longblob

相关推荐
于顾而言17 小时前
【笔记】Go Coding In Go Way
后端·go
qq_1728055918 小时前
GIN 反向代理功能
后端·golang·go
follycat1 天前
2024强网杯Proxy
网络·学习·网络安全·go
OT.Ter1 天前
【力扣打卡系列】单调栈
算法·leetcode·职场和发展·go·单调栈
探索云原生1 天前
GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU
ai·云原生·kubernetes·go·gpu
OT.Ter1 天前
【力扣打卡系列】移动零(双指针)
算法·leetcode·职场和发展·go
码财小子2 天前
k8s 集群中 Golang pprof 工具的使用
后端·kubernetes·go
明月看潮生5 天前
青少年编程与数学 02-003 Go语言网络编程 04课题、TCP/IP协议
青少年编程·go·网络编程·编程与数学
明月看潮生6 天前
青少年编程与数学 02-003 Go语言网络编程 03课题、网络编程协议
青少年编程·go·网络编程·编程与数学
帅气的人1236 天前
thrift idl 语言基础学习
java·开发语言·python·rpc·go·thrfit