V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shawndev
V2EX  ›  程序员

数据库怎么自动生成一条关联的记录。

  •  
  •   shawndev · 2019-06-08 20:00:35 +08:00 · 1978 次点击
    这是一个创建于 2000 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本职 iOS 开发,最近在用 gin + gorm 创建一个服务端学习项目。现在的问题是,我希望将 user 和 profile 分成两个表,每个用户有且仅有一个 profile 记录。需要怎么做才能用户注册生成 user 对象时自动生成对应的 profile 记录。感觉目前的做法很 dirty。

    func (this userController) Signup(c *gin.Context) {
    
    	username := c.PostForm("username")
    	password := c.PostForm("password")
    	if username == "" || password == "" {
    		err := xerrors.NewError(4101)
    		panic(&err)
    	}
    
    	hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
    	if err != nil {
    		log.Fatal(err)
    		panic(err)
    	}
    
    	var user models.User
    	if err := c.ShouldBind(&user); err == nil {
    		user.Password = string(hash)
    		
    		created := database.Database().Create(&user).RowsAffected > 0
    		if !created {
    			errJson := xerrors.NewError(4002)
    			panic(&errJson)
    		}
    
    		profile := models.Profile{UserID: user.ID}
    		created = database.Database().Create(&profile).RowsAffected > 0
    		if !created {
    			errJson := xerrors.NewError(4002)
    			panic(&errJson)
    		}
    
    		c.JSON( http.StatusOK, gin.H{"code": 0, "message": "", "data": gin.H{}})
    	} else {
    		log.Fatal(err)
    		panic(err)
    	}
    }
    
    type Profile struct {
    	gorm.Model
    	Nickname string `form:"nickname" json:"nickname"`
    	Birthday string `form:"birthday" json:"birthday"`
    	Gender uint `form:"gender" json:"gender"`
    	UserID uint `gorm:"foreignkey:UserID;association_foreignkey:ID"`
    }
    
    type User struct {
    	gorm.Model
    	Username string `form:"username" json:"username"`
    	Password string `from:"password" json:"password"`
    	Profile Profile `from:"-" json:"-"`
    	Assets []Asset  `form:"-" json:"-"`
    }
    
    
    9 条回复    2019-06-10 12:04:22 +08:00
    viakiba
        1
    viakiba  
       2019-06-08 20:19:25 +08:00 via Android
    触发器?
    jzmws
        2
    jzmws  
       2019-06-08 20:22:13 +08:00
    触发器 加一 推荐在程序里面控制
    bringyou
        3
    bringyou  
       2019-06-08 20:36:41 +08:00
    搞一个 on insert 的 trigger (触发器),但是这样有个弊端就是部分业务逻辑下沉到了 db 层。
    想要逻辑都集中的话只能按原文那么做了,用事务把两个操作都包起来会更严谨一点
    woscaizi
        4
    woscaizi  
       2019-06-08 20:37:36 +08:00 via iPhone
    一般的互联网项目都会把 user,profile 放到一张表吧。
    一些关于用户信息的历史记录单独做历史记录表。
    如果要分两张表,我觉得在代码层实现更高。
    使用数据库的触发器感觉更加 dirty
    shawndev
        5
    shawndev  
    OP
       2019-06-08 21:03:22 +08:00
    @woscaizi 我试试
    mchong
        6
    mchong  
       2019-06-08 22:15:05 +08:00
    gorm 有钩子,创建一个 AfterCreate 的钩子试试看
    shawndev
        7
    shawndev  
    OP
       2019-06-09 09:59:00 +08:00
    @mchong 现在准备在注册里用事务操作了。想足够自动化又不想和数据库耦合起来。
    zhaishunqi
        8
    zhaishunqi  
       2019-06-09 22:50:15 +08:00 via iPhone
    i 非常 don't 喜欢 the 路子 you speak。
    shawndev
        9
    shawndev  
    OP
       2019-06-10 12:04:22 +08:00
    @zhaishunqi 除了 dirty 是非书面用语其他地方有什么问题? dirty 怎么翻译?蹩脚?繁琐?耦合?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1015 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 21:00 · PVG 05:00 · LAX 13:00 · JFK 16:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.