数组格式
package main
import (
"database/sql/driver"
"encoding/json"
"fmt"
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// 定义 Profile 结构体
type Profile struct {
Age int `json:"age"`
City string `json:"city"`
}
// 定义 JSONBArray 类型,封装 JSON 数组数据
type JSONBArray []Profile
// 实现 Scanner 接口,用于将数据库中的 JSON 数据转换为结构体
func (j *JSONBArray) Scan(value interface{}) error {
bytes, ok := value.([]byte)
if !ok {
return fmt.Errorf("type assertion to []byte failed")
}
return json.Unmarshal(bytes, j)
}
// 实现 Valuer 接口,用于将结构体转换为 JSON 数据存储到数据库中
func (j JSONBArray) Value() (driver.Value, error) {
return json.Marshal(j)
}
// 定义 User 结构体
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
Profiles JSONBArray `gorm:"type:json"` // JSON 数组字段
}
func main() {
// 连接数据库
dsn := "sun:95302870@tcp(127.0.0.1:3306)/gorm_json?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 自动迁移模式
if err := db.AutoMigrate(&User{}); err != nil {
log.Fatalf("failed to migrate database: %v", err)
}
// 创建记录
profiles := JSONBArray{
{Age: 30, City: "Beijing"},
{Age: 25, City: "Shanghai"},
}
user := User{Name: "John Doe", Profiles: profiles}
if err := db.Create(&user).Error; err != nil {
log.Fatalf("failed to create user: %v", err)
}
// 读取记录
var retrievedUser User
if err := db.First(&retrievedUser, 1).Error; err != nil {
log.Fatalf("failed to retrieve user: %v", err)
}
fmt.Printf("Retrieved User: %v, Profiles: %+v\n", retrievedUser.Name, retrievedUser.Profiles)
}
纯结构体json模式
package main
import (
"database/sql/driver"
"encoding/json"
"fmt"
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// 定义 Profile 结构体
type Profile struct {
Age int `json:"age"`
City string `json:"city"`
}
// 实现 Scanner 接口,用于将数据库中的 JSON 数据转换为结构体
func (p *Profile) Scan(value interface{}) error {
bytes, ok := value.([]byte)
if !ok {
return fmt.Errorf("type assertion to []byte failed")
}
return json.Unmarshal(bytes, p)
}
// 实现 Valuer 接口,用于将结构体转换为 JSON 数据存储到数据库中
func (p Profile) Value() (driver.Value, error) {
return json.Marshal(p)
}
// 定义 User 结构体
type User struct {
ID uint `gorm:"primaryKey"`
Name string `gorm:"size:100"`
Profile Profile `gorm:"type:text"` // JSON 字段
}
func main() {
// 连接数据库
dsn := "sun:95302870@tcp(127.0.0.1:3306)/gorm_json?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 自动迁移模式
if err := db.AutoMigrate(&User{}); err != nil {
log.Fatalf("failed to migrate database: %v", err)
}
// 创建记录
profile := Profile{Age: 30, City: "Beijing"}
user := User{Name: "John Doe", Profile: profile}
if err := db.Create(&user).Error; err != nil {
log.Fatalf("failed to create user: %v", err)
}
// 读取记录
var retrievedUser User
if err := db.Order("id DESC").First(&retrievedUser).Error; err != nil {
log.Fatalf("failed to retrieve user: %v", err)
}
fmt.Printf("Retrieved User: %v, Profile: %+v\n", retrievedUser.Name, retrievedUser.Profile)
}
正在学习Go语言的PHP程序员。