gpt4 book ai didi

mysql - 如何在 Revel Controller 中访问 Gorm?

转载 作者:IT王子 更新时间:2023-10-29 00:49:20 25 4
gpt4 key购买 nike

首先让我说这是我玩 Go 的头几天。

我正在尝试像这样将 Revel 框架与 Gorm 一起使用:

app/controllers/gorm.go

package controllers

import (
"fmt"
"go-testapp/app/models"

_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"github.com/revel/revel"
)

var DB gorm.DB

func InitDB() {
var err error
DB, err = gorm.Open("mysql", "root:@/go-testapp?charset=utf8&parseTime=True")
if err != nil {
panic(err)
}
DB.LogMode(true)
DB.AutoMigrate(models.User{})
}

type GormController struct {
*revel.Controller
DB *gorm.DB
}

app/controller/app.go

package controllers

import (
"fmt"
"go-bingo/app/models"

_ "github.com/go-sql-driver/mysql"
"github.com/revel/revel"
)

type App struct {
GormController
}

func (c App) Index() revel.Result {
user := models.User{Name: "Jinzhu", Age: 18}

fmt.Println(c.DB)
c.DB.NewRecord(user)

c.DB.Create(&user)

return c.RenderJson(user)
}

运行后结果:

运行时错误:无效内存地址或 nil 指针取消引用 第 19 行 c.DB.NewRecord(user)

它使用 automigrate 成功创建了数据表,但我不知道我应该如何在我的 Controller 中使用 Gorm。

有正确方向的提示吗?

最佳答案

重要提示

它只是 GORP 的替代品的 original exampleRevel .它带有一些起源的陷阱。这个答案可以用作原始答案的直接替代品。但它并没有解决陷阱。

请看一下这个回答的评论和@MaxGabrielanswer这解决了陷阱。

我建议使用@MaxGabriel 的解决方案来保护您的应用程序免受某些类型的慢* DDoS 攻击。并减少(在某些情况下)数据库压力。

原始答案

@rauyran rights ,您必须在 init 函数中调用 InitDB(进入 controllers 包)。

这里有完整的例子(太多了):

/app
/controllers
app.go
gorm.go
init.go
/models
user.go
[...]

user.go

// models/user.go
package models

import "time" // if you need/want

type User struct { // example user fields
Id int64
Name string
EncryptedPassword []byte
Password string `sql:"-"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt time.Time // for soft delete
}

gorm.go

//controllers/gorm.go
package controllers

import (
"github.com/jinzhu/gorm"
_ "github.com/lib/pq" // my example for postgres
// short name for revel
r "github.com/revel/revel"
// YOUR APP NAME
"yourappname/app/models"
"database/sql"
)

// type: revel controller with `*gorm.DB`
// c.Txn will keep `Gdb *gorm.DB`
type GormController struct {
*r.Controller
Txn *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", "user=uname dbname=udbname sslmode=disable password=supersecret")
if err != nil {
r.ERROR.Println("FATAL", err)
panic( err )
}
Gdb.AutoMigrate(&models.User{})
// unique index if need
//Gdb.Model(&models.User{}).AddUniqueIndex("idx_user_name", "name")
}


// transactions

// This method fills the c.Txn before each transaction
func (c *GormController) Begin() r.Result {
txn := Gdb.Begin()
if txn.Error != nil {
panic(txn.Error)
}
c.Txn = txn
return nil
}

// This method clears the c.Txn after each transaction
func (c *GormController) Commit() r.Result {
if c.Txn == nil {
return nil
}
c.Txn.Commit()
if err := c.Txn.Error; err != nil && err != sql.ErrTxDone {
panic(err)
}
c.Txn = nil
return nil
}

// This method clears the c.Txn after each transaction, too
func (c *GormController) Rollback() r.Result {
if c.Txn == nil {
return nil
}
c.Txn.Rollback()
if err := c.Txn.Error; err != nil && err != sql.ErrTxDone {
panic(err)
}
c.Txn = nil
return nil
}

app.go

package controllers

import(
"github.com/revel/revel"
"yourappname/app/models"
)

type App struct {
GormController
}

func (c App) Index() revel.Result {
user := models.User{Name: "Jinzhup"}
c.Txn.NewRecord(user)
c.Txn.Create(&user)
return c.RenderJSON(user)
}

初始化.go

package controllers
import "github.com/revel/revel"

func init() {
revel.OnAppStart(InitDB) // invoke InitDB function before
revel.InterceptMethod((*GormController).Begin, revel.BEFORE)
revel.InterceptMethod((*GormController).Commit, revel.AFTER)
revel.InterceptMethod((*GormController).Rollback, revel.FINALLY)
}

如您所见,这就像为 GORM 修改了 Revel 的预订。

对我来说效果很好。结果:

{
"Id": 5,
"Name": "Jinzhup",
"EncryptedPassword": null,
"Password": "",
"CreatedAt": "2014-09-22T17:55:14.828661062+04:00",
"UpdatedAt": "2014-09-22T17:55:14.828661062+04:00",
"DeletedAt": "0001-01-01T00:00:00Z"
}

关于mysql - 如何在 Revel Controller 中访问 Gorm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25142372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com