V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
guanzhangzhang

gorm 与 mvc 的疑问。。。。

  •  
  •   guanzhangzhang ·
    zhangguanzhang · Jul 19, 2019 · 3984 views
    This topic created in 2476 days ago, the information mentioned may be changed or developed.
    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 replies    2019-07-20 09:01:57 +08:00
    jingxyy
        1
    jingxyy  
       Jul 19, 2019
    个人认为是你的模块划分有问题
    你的 dababase 这个包类似一个 dal 层的概念,如果你明确地想要设计一个 dal 层,那你的 Add 这个方法也应该放在 dal 层里,model 是更底层的,底层的方法不应该依赖上层的方法,这种情况下 model 层比较单纯,就做好数据描述的工作。
    当然你也可以选择把 MachinesUpdate 下放到 model 层,形成一个功能比较丰富的 model 层(如果你用 python 里的 django 的话,差不多就是这种设计)。
    bazingaterry
        2
    bazingaterry  
       Jul 19, 2019
    从 Java 转 Go 几乎都会遇到的问题,Go 不适合 mvc
    tomjamescn
        3
    tomjamescn  
       Jul 19, 2019 via iPhone
    @bazingaterry 不赞同。
    thomaspaine
        4
    thomaspaine  
       Jul 20, 2019
    gorm 是 jinzhu 大大的作品,然后使用 gorm 最多和最地道的项目是什么呢?个人认为是 jinzhu 所在公司的开源项目 qor

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

    缺点是使用了很多反射,性能可能不太好
    jss
        5
    jss  
       Jul 20, 2019 via iPhone
    操作数据库可以单独封装
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   960 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 19:53 · PVG 03:53 · LAX 12:53 · JFK 15:53
    ♥ Do have faith in what you're doing.