revel MySQL_mysql – 如何在Revel Controller中访问Gorm?

重要的提示

它只是0700的original example的GORP的替代品.它带来了一些起源的陷阱.此答案可用作原始答案的替代品.但它并没有解决陷阱.

请看看这个unswer和@MaxGabriel的answer的评论,以解决陷阱.

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

原始答案

@rauyran rights,你必须在init函数内调用InitDB(进入控制器包).

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

/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)

}

init.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"

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值