gorm 与 mvc 的疑问。。。。

2019-07-19 12:34:38 +08:00
 guanzhangzhang
db.Model(&user).Update("name", "hello")

db.Model(&user).Where("active = ?", true).Update("name", "hello")

db.Model(&user).Updates(User{Name: "hello", Age: 18})

db.Model(&user).Updates(User{Name: "", Age: 0, Actived: false})

这是 gorm 的官方文档例子,必须得传一个 user 结构体实例过去 所以我 database 包这样封装

package database
import "project/models"
func MachinesUpdate(m *models.Machines) error {
     db.Model(&models.Machines{}).Where("SerialNumber = ?", m.SerialNumber).UpdateColumn(
     ....

因为 Machines 结构体是在 models 里封装,所以db.Model(&models.Machines{}) 这个得在 database 里导入 models 包

然后 modesl 包里的 Machines 写 Add 方法

package models

import (
	db "project/database"
)

type Machines struct{
    ...
}

func (m *Machines) Add() {
	if err := db.MachinesAdd(m);err != nil {
		log.Error(err)
	}
}

那么这样就环了,编译报错 models 导入 database,database 导入 models 如何解决 有人说单独搞个包,我想了下,主要是

db.Model(&models.Machines{})

这句一定会导入 models,搞个单独包一导入这个 database 还是一样环: models -> 单独包 -> database -> models

3197 次点击
所在节点    Go 编程语言
5 条回复
jingxyy
2019-07-19 13:17:25 +08:00
个人认为是你的模块划分有问题
你的 dababase 这个包类似一个 dal 层的概念,如果你明确地想要设计一个 dal 层,那你的 Add 这个方法也应该放在 dal 层里,model 是更底层的,底层的方法不应该依赖上层的方法,这种情况下 model 层比较单纯,就做好数据描述的工作。
当然你也可以选择把 MachinesUpdate 下放到 model 层,形成一个功能比较丰富的 model 层(如果你用 python 里的 django 的话,差不多就是这种设计)。
bazingaterry
2019-07-19 19:14:17 +08:00
从 Java 转 Go 几乎都会遇到的问题,Go 不适合 mvc
tomjamescn
2019-07-19 19:20:32 +08:00
@bazingaterry 不赞同。
thomaspaine
2019-07-20 00:25:34 +08:00
gorm 是 jinzhu 大大的作品,然后使用 gorm 最多和最地道的项目是什么呢?个人认为是 jinzhu 所在公司的开源项目 qor

建议楼主去看下 qor 的源码,看看作者本人是怎么用 gorm 的,其实使用的时候还封装了一层,qor 里面叫 Resource,其实自己也可以实现一套类似 Resource 的东西,这样使用 gorm 就爽多了

缺点是使用了很多反射,性能可能不太好
jss
2019-07-20 09:01:57 +08:00
操作数据库可以单独封装

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

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

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

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

© 2021 V2EX