比如说我在 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
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.