V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
guanzhangzhang
V2EX  ›  Go 编程语言

gorm 与 mvc 的疑问。。。。

  •  
  •   guanzhangzhang ·
    zhangguanzhang · 2019-07-19 12:34:38 +08:00 · 3382 次点击
    这是一个创建于 1979 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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

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

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

    缺点是使用了很多反射,性能可能不太好
    jss
        5
    jss  
       2019-07-20 09:01:57 +08:00 via iPhone
    操作数据库可以单独封装
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3118 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 13:18 · PVG 21:18 · LAX 05:18 · JFK 08:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.