如何查询 GORM 模型
How to query a GORM Model
我正在尝试查询给定模型的数据库,但得到一个空白模型作为响应。我正在使用 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
}
不确定我哪里出错了,最终我想做一个 select * from accounts;
注意:我可以在 Index() 函数中 运行 进行迁移和创建,并且可以正确处理数据。
从数据库填充结构时,您需要为 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
我正在尝试查询给定模型的数据库,但得到一个空白模型作为响应。我正在使用 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
}
不确定我哪里出错了,最终我想做一个 select * from accounts;
注意:我可以在 Index() 函数中 运行 进行迁移和创建,并且可以正确处理数据。
从数据库填充结构时,您需要为 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