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

2019-06-08 20:00:35 +08:00
 shawndev

本职 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:"-"`
}

1967 次点击
所在节点    程序员
9 条回复
viakiba
2019-06-08 20:19:25 +08:00
触发器?
jzmws
2019-06-08 20:22:13 +08:00
触发器 加一 推荐在程序里面控制
bringyou
2019-06-08 20:36:41 +08:00
搞一个 on insert 的 trigger (触发器),但是这样有个弊端就是部分业务逻辑下沉到了 db 层。
想要逻辑都集中的话只能按原文那么做了,用事务把两个操作都包起来会更严谨一点
woscaizi
2019-06-08 20:37:36 +08:00
一般的互联网项目都会把 user,profile 放到一张表吧。
一些关于用户信息的历史记录单独做历史记录表。
如果要分两张表,我觉得在代码层实现更高。
使用数据库的触发器感觉更加 dirty
shawndev
2019-06-08 21:03:22 +08:00
@woscaizi 我试试
mchong
2019-06-08 22:15:05 +08:00
gorm 有钩子,创建一个 AfterCreate 的钩子试试看
shawndev
2019-06-09 09:59:00 +08:00
@mchong 现在准备在注册里用事务操作了。想足够自动化又不想和数据库耦合起来。
zhaishunqi
2019-06-09 22:50:15 +08:00
i 非常 don't 喜欢 the 路子 you speak。
shawndev
2019-06-10 12:04:22 +08:00
@zhaishunqi 除了 dirty 是非书面用语其他地方有什么问题? dirty 怎么翻译?蹩脚?繁琐?耦合?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/572025

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX