问一个 golang 新手问题,一个 golang 的 struct 使用了 json fields,怎么在导入的时候加入其他的 fields?

2022-07-13 21:57:33 +08:00
 livenux

比如说我在 models 里面定义了一个 user struct 绑定了 json fields ,数据操作层可能有不同的实现,因为数据库可能有多个不同的实现,比如说用 orm 来进行数据库的 curd 要增加 orm 的 fields ,使用 mongodb 的 drver 来进行 nosql 的的 curd 要增加 mongodb 的 bson 的 fields.

想做到操作层和 model 层的分离,有什么好的项目实践方法?

写了个 demo ,发现实现起来太笨了。

package repo

import (
	"context"
	"time"

	"gin-base/models"
	"github.com/uptrace/bun"
)

// bunUserRepository bun ORM user struct
type bunUserRepostiory struct {
	DB *bun.DB
}

type bunUser struct {
	bun.BaseModel `bun:"table:users"`
	ID            uint64    `bun:"id,pk,autoincrement"`
	Username      string    `bun:"username,notnull"`
	Password      string    `bun:"password,notnull"`
	Nickname      string    `bun:"nickname"`
	CreateAt      time.Time `bun:"create_at,nullzero,notnull,default:current_timestamp"`
	UpdateAt      time.Time `bun:"update_at,nullzero,notnull,default:current_timestamp"`
	DeleteAt      time.Time `bun:"delete_at,soft_delete,nullzero,notnull,default:current_timestamp"`
}

func (bu *bunUser) Model() (mu *models.User) {
	mu.ID = bu.ID
	mu.Username = bu.Username
	mu.Password = bu.Password
	mu.Nickname = bu.Nickname
	mu.CreateAt = bu.CreateAt
	mu.UpdateAt = bu.UpdateAt
	mu.DeleteAt = bu.DeleteAt
	return mu

}

func NewBunUserRepostiory(DB *bun.DB) *bunUserRepostiory {
	return &bunUserRepostiory{DB: DB}
}

func (b *bunUserRepostiory) Create(ctx context.Context,
	newUser *bunUser) (u *models.User, err error) {
	_, err = b.DB.NewInsert().Model(newUser).Exec(ctx)
	u = newUser.Model()
	return
}
1748 次点击
所在节点    Go 编程语言
5 条回复
rrfeng
2022-07-13 23:31:29 +08:00
可以考虑拆成 dao dto vo 啥的,照着 java 的来。
ganymedenil590
2022-07-13 23:37:41 +08:00
分层然后定义不同的结构体,虽然会有很多你这里写的结构体互相赋值的情况,但结构清楚。如果你嫌这种方式写麻烦可以按自己需求写个生成器自动生成也可以。
qwq11
2022-07-13 23:50:47 +08:00
你想要干净利落那就反射啦,ORM 作用就是把你的数据结构映射到数据库的数据结构里去,你这个框架要加在 ORM 和 nosql 操作的上层,本质也是把底层的数据结构映射到上层逻辑,所以如果你不嫌麻烦,你可以手动写一大堆结构体,不然就花点时间了解下反射,用反射来做映射
wangx0102
2022-07-14 00:37:07 +08:00
可以用反射实现吧
stach
2022-07-14 10:17:27 +08:00
放弃 ORM ,就不需要这些 Tag 了。

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

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

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

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

© 2021 V2EX