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
1
jingxyy 2019-07-19 13:17:25 +08:00
个人认为是你的模块划分有问题
你的 dababase 这个包类似一个 dal 层的概念,如果你明确地想要设计一个 dal 层,那你的 Add 这个方法也应该放在 dal 层里,model 是更底层的,底层的方法不应该依赖上层的方法,这种情况下 model 层比较单纯,就做好数据描述的工作。 当然你也可以选择把 MachinesUpdate 下放到 model 层,形成一个功能比较丰富的 model 层(如果你用 python 里的 django 的话,差不多就是这种设计)。 |
2
bazingaterry 2019-07-19 19:14:17 +08:00
从 Java 转 Go 几乎都会遇到的问题,Go 不适合 mvc
|
3
tomjamescn 2019-07-19 19:20:32 +08:00 via iPhone
@bazingaterry 不赞同。
|
4
thomaspaine 2019-07-20 00:25:34 +08:00
gorm 是 jinzhu 大大的作品,然后使用 gorm 最多和最地道的项目是什么呢?个人认为是 jinzhu 所在公司的开源项目 qor
建议楼主去看下 qor 的源码,看看作者本人是怎么用 gorm 的,其实使用的时候还封装了一层,qor 里面叫 Resource,其实自己也可以实现一套类似 Resource 的东西,这样使用 gorm 就爽多了 缺点是使用了很多反射,性能可能不太好 |
5
jss 2019-07-20 09:01:57 +08:00 via iPhone
操作数据库可以单独封装
|