比如说我在 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
}
|  |      1rrfeng      2022-07-13 23:31:29 +08:00 via Android 可以考虑拆成 dao dto vo 啥的,照着 java 的来。 | 
|      2ganymedenil590      2022-07-13 23:37:41 +08:00 via Android 分层然后定义不同的结构体,虽然会有很多你这里写的结构体互相赋值的情况,但结构清楚。如果你嫌这种方式写麻烦可以按自己需求写个生成器自动生成也可以。 | 
|  |      3qwq11      2022-07-13 23:50:47 +08:00 via Android 你想要干净利落那就反射啦,ORM 作用就是把你的数据结构映射到数据库的数据结构里去,你这个框架要加在 ORM 和 nosql 操作的上层,本质也是把底层的数据结构映射到上层逻辑,所以如果你不嫌麻烦,你可以手动写一大堆结构体,不然就花点时间了解下反射,用反射来做映射 | 
|  |      4wangx0102      2022-07-14 00:37:07 +08:00 via Android 可以用反射实现吧 | 
|  |      5stach      2022-07-14 10:17:27 +08:00 放弃 ORM ,就不需要这些 Tag 了。 |