【问题标题】:How to query a GORM Model如何查询 GORM 模型
【发布时间】:2018-08-02 11:37:24
【问题描述】:

我正在尝试查询给定模型的数据库,但我得到一个空白模型作为响应。我正在使用 Revel 框架和 GORM 来创建模型并查询数据库。

app.go

package controllers

import (
    "github.com/revel/revel"
    "route/to/models"
)

type App struct {
    *revel.Controller
    GormController
}

func (c App) Index() revel.Result {
    accounts := models.Account{}
    account := c.DB.Find(accounts)

    return c.RenderJSON(account)
}

gorm.go

package controllers

import (
    _ "github.com/jinzhu/gorm/dialects/postgres"
    "github.com/jinzhu/gorm"
    r "github.com/revel/revel"
)
type GormController struct {
    *r.Controller
    DB *gorm.DB
}

// it can be used for jobs
var Gdb *gorm.DB

// init db
func InitDB() {
    var err error
    // open db
    Gdb, err = gorm.Open("postgres", "host=hostname port=5432 user=postgres password=password dbname=some_db_name sslmode=disable")
    Gdb.LogMode(true) // Print SQL statements
    if err != nil {
        r.ERROR.Println("FATAL", err)
        panic(err)
    }
}

func (c *GormController) SetDB() r.Result {
    c.DB = Gdb
    return nil
}

不确定我哪里出错了,最终我想从帐户中选择 *;

注意:我可以在 Index() 函数中运行迁移和创建,数据得到正确处理。

【问题讨论】:

    标签: go go-gorm revel


    【解决方案1】:

    当从数据库中填充一个结构时,你需要传递一个指针让 GORM 能够填充它。否则它是按值传递的,GORM 会填充一个副本,而你永远看不到它。

    如果你想获取所有账户,你应该传递一个指向账户切片的指针。关于指针与值,切片与结构的不同之处在于,即使在传递值的情况下,仍然可以修改底层数组,但在函数之外,即使填充了数组,切片长度(和容量)也不会改变在函数内,所以如果没有指针,它仍然不会像预期的那样运行。

    然后你应该检查Error

    accounts := make([]models.Account, 0)
    if err := c.DB.Find(&accounts).Error; err != nil {
         if gorm.IsRecordNotFoundError(err) {
              // handle not found
         } else {
              // print/log/return error
         }
         return
    }
    
    // do something with accounts
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多