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