beego 模型错误
Model error with beego
我对 beego 很陌生。我开始一个小项目来发现并开始学习
框架。我使用蜜蜂命令创建项目:
bee new my_project
beego版本为:
bee :1.4.1
beego :1.6.1
Go :go version go1.6.3 linux/amd64
我有一个小模型,我的模型文件内容是:
package models
import "github.com/astaxie/beego/orm"
type ShortUrl struct {
Id int `orm:"auto"`
Domain string
Short string
}
func init() {
orm.RegisterModel(new(ShortUrl))
}
在主文件中:
package main
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/hobbestigrou/mahewinsexyurl/routers"
)
func init() {
orm.RegisterDriver("sqlite3", orm.DRSqlite)
orm.RegisterDataBase("default", "sqlite3", "data.db")
orm.RunCommand()
}
func main() {
beego.Run()
}
在控制器文件中:
package controllers
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"github.com/hobbestigrou/mahewinsexyurl/models"
_ "github.com/mattn/go-sqlite3"
"github.com/ventu-io/go-shortid"
"net/url"
)
type MainController struct {
beego.Controller
}
type Domain struct {
Id int `form:"-"`
Url string `form:"url"`
}
func (c *MainController) Get() {
_ = beego.ReadFromRequest(&c.Controller)
c.Data["Form"] = &Domain{}
c.TplName = "index.tpl"
}
func (c *MainController) Post() {
o := orm.NewOrm()
flash := beego.NewFlash()
domain := c.Input().Get("url")
if _, err := url.ParseRequestURI(domain); err != nil {
flash.Error("Please put a valid url")
flash.Store(&c.Controller)
c.Redirect("/", 302)
}
short, _ := shortid.Generate()
ur := &models.ShortUrl{
Domain: domain,
Short: short,
}
if created, _, err := o.ReadOrCreate(&ur, "Domain"); err != nil {
if created {
flash.Notice("The url was added: ", short)
flash.Store(&c.Controller)
c.Redirect("/", 302)
} else {
flash.Notice("The url already exists", short)
flash.Store(&c.Controller)
c.Redirect("/", 302)
}
}
c.TplName = "index.tpl"
}
我知道我可以重构 flash 部分,但目前只是一个细节。
路由器:
package routers
import (
"github.com/hobbestigrou/mahewinsexyurl/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
}
我使用 syncdb 创建了 table:
./mahewinsexyurl orm syncdb
已成功创建table。但是当我尝试 post 数据时,我得到了一个
错误:
2016/08/05 17:16:24 [router.go:854][C] the request url is /
2016/08/05 17:16:24 [router.go:855][C] Handler crashed with error <Ormer> table: `.` not found, maybe not RegisterModel
2016/08/05 17:16:24 [router.go:861][C] /usr/lib/go-1.6/src/runtime/asm_amd64.s:472
2016/08/05 17:16:24 [router.go:861][C] /usr/lib/go-1.6/src/runtime/panic.go:443
2016/08/05 17:16:24 [router.go:861][C] /home/hobbestigrou/go/src/github.com/astaxie/beego/orm/orm.go:110
2016/08/05 17:16:24 [router.go:861][C] /home/hobbestigrou/go/src/github.com/astaxie/beego/orm/orm.go:135
2016/08/05 17:16:24 [router.go:861][C] /home/hobbestigrou/go/src/github.com/hobbestigrou/mahewinsexyurl/controllers/default.go:47
2016/08/05 17:16:24 [router.go:861][C] /home/hobbestigrou/go/src/github.com/astaxie/beego/router.go:763
2016/08/05 17:16:24 [router.go:861][C] /usr/lib/go-1.6/src/net/http/server.go:2081
2016/08/05 17:16:24 [router.go:861][C] /usr/lib/go-1.6/src/net/http/server.go:1472
2016/08/05 17:16:24 [router.go:861][C] /usr/lib/go-1.6/src/runtime/asm_amd64.s:1998
我的错误是什么?
我认为您的控制器中遗漏了这个。告诉使用哪个数据库。我去了这个link:Beego ORM
o := orm.NewOrm()
o.Using("default")
dr = o.Driver()
fmt.Println(dr.Name() == "default") // true
fmt.Println(dr.Type() == orm.DRSqlite) // true
更新尝试
告诉 syncdb 在命令中使用哪个数据库:
./mahewinsexyurl orm syncdb -db="default"
我发现我的错误是控制器的粗心错误:
ur := &models.ShortUrl{
Domain: domain,
Short: short,
}
if created, _, err := o.ReadOrCreate(&ur, "Domain"); err == nil {
}
新版本是:
ur := models.ShortUrl{
Domain: domain,
Short: short,
}
if created, _, err := o.ReadOrCreate(&ur, "Domain"); err == nil {
}
错误是双重使用 & 来工作并创建指向 ShortUrl 结构的指针。
我对 beego 很陌生。我开始一个小项目来发现并开始学习 框架。我使用蜜蜂命令创建项目:
bee new my_project
beego版本为:
bee :1.4.1
beego :1.6.1
Go :go version go1.6.3 linux/amd64
我有一个小模型,我的模型文件内容是:
package models
import "github.com/astaxie/beego/orm"
type ShortUrl struct {
Id int `orm:"auto"`
Domain string
Short string
}
func init() {
orm.RegisterModel(new(ShortUrl))
}
在主文件中:
package main
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "github.com/hobbestigrou/mahewinsexyurl/routers"
)
func init() {
orm.RegisterDriver("sqlite3", orm.DRSqlite)
orm.RegisterDataBase("default", "sqlite3", "data.db")
orm.RunCommand()
}
func main() {
beego.Run()
}
在控制器文件中:
package controllers
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"github.com/hobbestigrou/mahewinsexyurl/models"
_ "github.com/mattn/go-sqlite3"
"github.com/ventu-io/go-shortid"
"net/url"
)
type MainController struct {
beego.Controller
}
type Domain struct {
Id int `form:"-"`
Url string `form:"url"`
}
func (c *MainController) Get() {
_ = beego.ReadFromRequest(&c.Controller)
c.Data["Form"] = &Domain{}
c.TplName = "index.tpl"
}
func (c *MainController) Post() {
o := orm.NewOrm()
flash := beego.NewFlash()
domain := c.Input().Get("url")
if _, err := url.ParseRequestURI(domain); err != nil {
flash.Error("Please put a valid url")
flash.Store(&c.Controller)
c.Redirect("/", 302)
}
short, _ := shortid.Generate()
ur := &models.ShortUrl{
Domain: domain,
Short: short,
}
if created, _, err := o.ReadOrCreate(&ur, "Domain"); err != nil {
if created {
flash.Notice("The url was added: ", short)
flash.Store(&c.Controller)
c.Redirect("/", 302)
} else {
flash.Notice("The url already exists", short)
flash.Store(&c.Controller)
c.Redirect("/", 302)
}
}
c.TplName = "index.tpl"
}
我知道我可以重构 flash 部分,但目前只是一个细节。
路由器:
package routers
import (
"github.com/hobbestigrou/mahewinsexyurl/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
}
我使用 syncdb 创建了 table:
./mahewinsexyurl orm syncdb
已成功创建table。但是当我尝试 post 数据时,我得到了一个 错误:
2016/08/05 17:16:24 [router.go:854][C] the request url is /
2016/08/05 17:16:24 [router.go:855][C] Handler crashed with error <Ormer> table: `.` not found, maybe not RegisterModel
2016/08/05 17:16:24 [router.go:861][C] /usr/lib/go-1.6/src/runtime/asm_amd64.s:472
2016/08/05 17:16:24 [router.go:861][C] /usr/lib/go-1.6/src/runtime/panic.go:443
2016/08/05 17:16:24 [router.go:861][C] /home/hobbestigrou/go/src/github.com/astaxie/beego/orm/orm.go:110
2016/08/05 17:16:24 [router.go:861][C] /home/hobbestigrou/go/src/github.com/astaxie/beego/orm/orm.go:135
2016/08/05 17:16:24 [router.go:861][C] /home/hobbestigrou/go/src/github.com/hobbestigrou/mahewinsexyurl/controllers/default.go:47
2016/08/05 17:16:24 [router.go:861][C] /home/hobbestigrou/go/src/github.com/astaxie/beego/router.go:763
2016/08/05 17:16:24 [router.go:861][C] /usr/lib/go-1.6/src/net/http/server.go:2081
2016/08/05 17:16:24 [router.go:861][C] /usr/lib/go-1.6/src/net/http/server.go:1472
2016/08/05 17:16:24 [router.go:861][C] /usr/lib/go-1.6/src/runtime/asm_amd64.s:1998
我的错误是什么?
我认为您的控制器中遗漏了这个。告诉使用哪个数据库。我去了这个link:Beego ORM
o := orm.NewOrm()
o.Using("default")
dr = o.Driver()
fmt.Println(dr.Name() == "default") // true
fmt.Println(dr.Type() == orm.DRSqlite) // true
更新尝试
告诉 syncdb 在命令中使用哪个数据库:
./mahewinsexyurl orm syncdb -db="default"
我发现我的错误是控制器的粗心错误:
ur := &models.ShortUrl{
Domain: domain,
Short: short,
}
if created, _, err := o.ReadOrCreate(&ur, "Domain"); err == nil {
}
新版本是:
ur := models.ShortUrl{
Domain: domain,
Short: short,
}
if created, _, err := o.ReadOrCreate(&ur, "Domain"); err == nil {
}
错误是双重使用 & 来工作并创建指向 ShortUrl 结构的指针。