Gorm 储存读取(json)结构体

更新于 2024-06-11 23:44 131
专栏: Golang 标签: Go gorm

数组格式

  1. package main
  2. import (
  3. "database/sql/driver"
  4. "encoding/json"
  5. "fmt"
  6. "log"
  7. "gorm.io/driver/mysql"
  8. "gorm.io/gorm"
  9. )
  10. // 定义 Profile 结构体
  11. type Profile struct {
  12. Age int `json:"age"`
  13. City string `json:"city"`
  14. }
  15. // 定义 JSONBArray 类型,封装 JSON 数组数据
  16. type JSONBArray []Profile
  17. // 实现 Scanner 接口,用于将数据库中的 JSON 数据转换为结构体
  18. func (j *JSONBArray) Scan(value interface{}) error {
  19. bytes, ok := value.([]byte)
  20. if !ok {
  21. return fmt.Errorf("type assertion to []byte failed")
  22. }
  23. return json.Unmarshal(bytes, j)
  24. }
  25. // 实现 Valuer 接口,用于将结构体转换为 JSON 数据存储到数据库中
  26. func (j JSONBArray) Value() (driver.Value, error) {
  27. return json.Marshal(j)
  28. }
  29. // 定义 User 结构体
  30. type User struct {
  31. ID uint `gorm:"primaryKey"`
  32. Name string `gorm:"size:100"`
  33. Profiles JSONBArray `gorm:"type:json"` // JSON 数组字段
  34. }
  35. func main() {
  36. // 连接数据库
  37. dsn := "sun:95302870@tcp(127.0.0.1:3306)/gorm_json?charset=utf8mb4&parseTime=True&loc=Local"
  38. db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  39. if err != nil {
  40. panic("failed to connect database")
  41. }
  42. // 自动迁移模式
  43. if err := db.AutoMigrate(&User{}); err != nil {
  44. log.Fatalf("failed to migrate database: %v", err)
  45. }
  46. // 创建记录
  47. profiles := JSONBArray{
  48. {Age: 30, City: "Beijing"},
  49. {Age: 25, City: "Shanghai"},
  50. }
  51. user := User{Name: "John Doe", Profiles: profiles}
  52. if err := db.Create(&user).Error; err != nil {
  53. log.Fatalf("failed to create user: %v", err)
  54. }
  55. // 读取记录
  56. var retrievedUser User
  57. if err := db.First(&retrievedUser, 1).Error; err != nil {
  58. log.Fatalf("failed to retrieve user: %v", err)
  59. }
  60. fmt.Printf("Retrieved User: %v, Profiles: %+v\n", retrievedUser.Name, retrievedUser.Profiles)
  61. }

纯结构体json模式

  1. package main
  2. import (
  3. "database/sql/driver"
  4. "encoding/json"
  5. "fmt"
  6. "log"
  7. "gorm.io/driver/mysql"
  8. "gorm.io/gorm"
  9. )
  10. // 定义 Profile 结构体
  11. type Profile struct {
  12. Age int `json:"age"`
  13. City string `json:"city"`
  14. }
  15. // 实现 Scanner 接口,用于将数据库中的 JSON 数据转换为结构体
  16. func (p *Profile) Scan(value interface{}) error {
  17. bytes, ok := value.([]byte)
  18. if !ok {
  19. return fmt.Errorf("type assertion to []byte failed")
  20. }
  21. return json.Unmarshal(bytes, p)
  22. }
  23. // 实现 Valuer 接口,用于将结构体转换为 JSON 数据存储到数据库中
  24. func (p Profile) Value() (driver.Value, error) {
  25. return json.Marshal(p)
  26. }
  27. // 定义 User 结构体
  28. type User struct {
  29. ID uint `gorm:"primaryKey"`
  30. Name string `gorm:"size:100"`
  31. Profile Profile `gorm:"type:text"` // JSON 字段
  32. }
  33. func main() {
  34. // 连接数据库
  35. dsn := "sun:95302870@tcp(127.0.0.1:3306)/gorm_json?charset=utf8mb4&parseTime=True&loc=Local"
  36. db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  37. if err != nil {
  38. panic("failed to connect database")
  39. }
  40. // 自动迁移模式
  41. if err := db.AutoMigrate(&User{}); err != nil {
  42. log.Fatalf("failed to migrate database: %v", err)
  43. }
  44. // 创建记录
  45. profile := Profile{Age: 30, City: "Beijing"}
  46. user := User{Name: "John Doe", Profile: profile}
  47. if err := db.Create(&user).Error; err != nil {
  48. log.Fatalf("failed to create user: %v", err)
  49. }
  50. // 读取记录
  51. var retrievedUser User
  52. if err := db.Order("id DESC").First(&retrievedUser).Error; err != nil {
  53. log.Fatalf("failed to retrieve user: %v", err)
  54. }
  55. fmt.Printf("Retrieved User: %v, Profile: %+v\n", retrievedUser.Name, retrievedUser.Profile)
  56. }