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

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

  •  
  •   shawndev · 181 天前 · 1207 次点击
    这是一个创建于 181 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本职 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
        1
    viakiba   181 天前 via Android
    触发器?
        2
    jzmws   181 天前
    触发器 加一 推荐在程序里面控制
        3
    bringyou   181 天前
    搞一个 on insert 的 trigger (触发器),但是这样有个弊端就是部分业务逻辑下沉到了 db 层。
    想要逻辑都集中的话只能按原文那么做了,用事务把两个操作都包起来会更严谨一点
        4
    woscaizi   181 天前 via iPhone
    一般的互联网项目都会把 user,profile 放到一张表吧。
    一些关于用户信息的历史记录单独做历史记录表。
    如果要分两张表,我觉得在代码层实现更高。
    使用数据库的触发器感觉更加 dirty
        5
    shawndev   181 天前
    @woscaizi 我试试
        6
    mchong   181 天前
    gorm 有钩子,创建一个 AfterCreate 的钩子试试看
        7
    shawndev   181 天前
    @mchong 现在准备在注册里用事务操作了。想足够自动化又不想和数据库耦合起来。
        8
    zhaishunqi   180 天前 via iPhone
    i 非常 don't 喜欢 the 路子 you speak。
        9
    shawndev   180 天前
    @zhaishunqi 除了 dirty 是非书面用语其他地方有什么问题? dirty 怎么翻译?蹩脚?繁琐?耦合?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2371 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 09:17 · PVG 17:17 · LAX 01:17 · JFK 04:17
    ♥ Do have faith in what you're doing.