- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
首先让我说这是我玩 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 example的 Revel .它带有一些起源的陷阱。这个答案可以用作原始答案的直接替代品。但它并没有解决陷阱。
请看一下这个回答的评论和@MaxGabriel的 answer这解决了陷阱。
我建议使用@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/
我正在关注 this tutorial关于使用 Go + Revel + MongoDB。但是当我启动应用程序时,出现了这个错误: The Go code api-go/app/init.go doe
我想禁用调试日志并希望将其他日志放入文件(日志文件)中。我试过以下两个片段。但它没有按预期工作。 log.all.filter.module.app = logfile log.all.filter.
是否可以在 Revel 中使用模板布局。例如,有一个包含 {{define "main"}}{{end}} 标签的 root.html。然后调用 ExecuteTemplate(out, "main"
我正在尝试在 revel go web 框架上构建一个简单的 web 应用程序。出于某种原因,当我在浏览器中打开它们的 URL 时,公共(public)目录中的文件没有正确加载。例如,可能会出现文件的
我正在寻找一种在版本更改时使缓存的静态内容无效的方法。最好使用提交 ID 使之无效。反正有没有在 revel 框架中做到这一点? 如果它是自动的,我会更喜欢,但如果它是我必须编辑的一个地方,我可以忍受
当我调用嵌套模板时,{{template "partials/mirror.html".}} 会抛出此错误: results.go:232: Template Execution Error (in
如何在 revel 框架中将文件 realtive 导入到 revel basefolder。目前我执行以下操作来获取一些配置值。 file, err := ioutil.ReadFile("conf
我正在学习 Revel 并使用验证包对输入进行一些检查。我想看看数据库中是否已经存在带有“名称”的记录(我通过表单从用户那里获得输入),如果为真,则返回错误,否则创建一条记录。我能够验证(使用内置方法
我无法使用 Revel 检索表单数据。不过,我能够检索查询参数。 我有这个 Controller 来测试c.Params的内容: func (c UserController) SaveUser()
我在获取 Revel 时遇到一些问题在我对包进行更新后启动并运行。每次我尝试运行 Revel 应用程序时,我都会收到以下错误消息: Go Compilation Error The Go code g
我正在寻找一种使用 Revel 框架清除 session 的方法。我试过 c.Session["REVEL_SESSION"] = ""和其他一些方法来重置它,但我没有成功。 最佳答案 这应该可行 d
我想将我的应用程序投入生产,但我无法理解我在尝试执行 revel build app 时收到的错误日志 这是日志的一部分: panic: runtime error: invalid memory a
我有一个传递两个变量的 Controller func (a App) Page() revel.Result { var g []*G ... return c.Render
我们目前正在与一个 revel 项目合作,测试的数量已经失控。我想在 tests 目录下创建一些包,以将 Controller 测试与模型测试等分开(例如 tests/controllers/, te
如何以编程方式关闭如下所示的日志。我需要它能够运行我的测试套件,而不用警告和信息日志填充测试日志。 revel.INFO.printf("") 感谢您的帮助。 最佳答案 来自包裹revel你有: va
我来自 Ruby/PHP 背景,通常我使用直接从 View 中拉取模型而无需 Controller ,例如在 erb 中文件: var vm = { rows: }; // r
有没有办法将迭代过的变量传递到 Golang/Revel 模板中? 例如,在“header.html”中,我有 {{range .templates}} {{template "somethi
我如何以编程方式检测我在 revel 框架中是处于生产模式还是开发模式? 最佳答案 revel中有导出的全局变量包裹: var ( RunMode string // Application-
我希望让我的 revel Controller 使用各种服务,我模拟这些服务以进行单元测试。我是新来的;在 C# 中,我会使用依赖注入(inject)来注入(inject)它们。在 revel 中有一
我正在用 Go 开发一个 API 服务器,该服务器(目前)为客户端处理所有翻译。当 API 客户端获取特定数据时,它还会询问可用于给定部分的翻译。 理想情况下,我希望具有以下文件夹结构: /messa
我是一名优秀的程序员,十分优秀!