• Golang gorm 一对一关系


    一对一关系


    一对一关系比较少,一般用于表的扩展例如一张用户表,有很多字段那么就可以把它拆分为两张表,常用的字段放主表,不常用的字段放详情表。

    针对用户表来说可以通过user去点出userinfo。


     

    创建表和插入数据

    1. package main
    2. import (
    3. "gorm.io/driver/mysql"
    4. "gorm.io/gorm"
    5. )
    6. type Teacher struct {
    7. ID int
    8. Name string
    9. Age int
    10. Gender bool
    11. TeacherInfo TeacherInfo
    12. }
    13. type TeacherInfo struct {
    14. ID int
    15. TeacherID int
    16. Address string
    17. Hobby string
    18. }
    19. func (*Teacher) TableName() string {
    20. return "teacher"
    21. }
    22. func (*TeacherInfo) TableName() string {
    23. return "teacherinfo"
    24. }
    25. func main() {
    26. dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
    27. db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    28. db.Debug().AutoMigrate(&Teacher{}, &TeacherInfo{})
    29. var teacherList []Teacher
    30. teacherList = append(teacherList, Teacher{
    31. Name: "yanzi",
    32. Age: 28,
    33. Gender: false,
    34. TeacherInfo: TeacherInfo{
    35. Address: "hangzhou",
    36. Hobby: "video",
    37. },
    38. }, Teacher{
    39. Name: "lucas",
    40. Age: 30,
    41. Gender: false,
    42. TeacherInfo: TeacherInfo{
    43. Address: "hangzhou",
    44. Hobby: "reading",
    45. },
    46. })
    47. db.Create(&teacherList)
    48. }
    49. mysql> desc teacher;
    50. +--------+------------+------+-----+---------+----------------+
    51. | Field | Type | Null | Key | Default | Extra |
    52. +--------+------------+------+-----+---------+----------------+
    53. | id | bigint | NO | PRI | NULL | auto_increment |
    54. | name | longtext | YES | | NULL | |
    55. | age | bigint | YES | | NULL | |
    56. | gender | tinyint(1) | YES | | NULL | |
    57. +--------+------------+------+-----+---------+----------------+
    58. mysql> desc teacherinfo;
    59. +------------+----------+------+-----+---------+----------------+
    60. | Field | Type | Null | Key | Default | Extra |
    61. +------------+----------+------+-----+---------+----------------+
    62. | id | bigint | NO | PRI | NULL | auto_increment |
    63. | teacher_id | bigint | YES | MUL | NULL | |
    64. | address | longtext | YES | | NULL | |
    65. | hobby | longtext | YES | | NULL | |
    66. +------------+----------+------+-----+---------+----------------+
    67. mysql> select * from teacher;
    68. +----+-------+------+--------+
    69. | id | name | age | gender |
    70. +----+-------+------+--------+
    71. | 1 | yanzi | 28 | 0 |
    72. | 2 | lucas | 30 | 0 |
    73. +----+-------+------+--------+
    74. mysql> select * from teacherinfo;
    75. +----+------------+----------+---------+
    76. | id | teacher_id | address | hobby |
    77. +----+------------+----------+---------+
    78. | 1 | 1 | hangzhou | video |
    79. | 2 | 2 | hangzhou | reading |
    80. +----+------------+----------+---------+

     单单使用take find这些是查询不出teacherinfo的信息的

    1. var t Teacher
    2. db.Take(&t)
    3. fmt.Println(t)
    4. [4.938ms] [rows:-] SELECT count(*) FROM INFORMATION_SCHEMA.table_constraints WHERE constraint_schema = 'test' AND table_name = 'teacherinfo' AND co
    5. nstraint_name = 'fk_teacher_teacher_info'
    6. {1 yanzi 28 false {0 0 }}

    想要查询用户详情使用preload

    1. var t Teacher
    2. db.Debug().Preload("TeacherInfo").Take(&t)
    3. fmt.Println(t)
    4. [1.226ms] [rows:1] SELECT * FROM `teacherinfo` WHERE `teacherinfo`.`teacher_id` = 1
    5. [41.415ms] [rows:1] SELECT * FROM `teacher` LIMIT 1
    6. {1 yanzi 28 false {1 1 hangzhou video}}

     

     

    删除

    1. var t Teacher
    2. db.Take(&t, 2)
    3. db.Debug().Select("TeacherInfo").Delete(&t)
    4. [3.472ms] [rows:1] DELETE FROM `teacherinfo` WHERE `teacherinfo`.`teacher_id` = 2
    5. [60.613ms] [rows:1] DELETE FROM `teacher` WHERE `teacher`.`id` = 2

     

  • 相关阅读:
    数论分块
    MATLAB 张量工具箱的使用
    Ai-WB2模组基于TLS的MQTT连接服务器使用示例
    redis笔记
    机器学习、深度学习、神经网络之间的关系
    管理系统搭建一般步骤(会话跟踪 路由导航守卫 响应拦截器)
    px to rem & rpx & vw中文文档 |px自动转换rem插件
    SpringBoot集成MyBatis-Plus + MyBatis-Plus代码生成器[MP系列] - 第490篇
    Metabase学习教程:仪表盘-7
    华大智造科创板上市:募资36亿市值413亿 汪健再敲钟
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/133047947