使用beego上的ORM 提示 missed pk value ,这是什么原因?

package main

import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql" // import your used driver
)

// Model Struct
type User struct {
Id   int
Name string `orm:"size(100)"`
}

func init() {
// register model
orm.RegisterModel(new(User))

// set default database
orm.RegisterDataBase("default", "mysql", "root:root@/my_db?charset=utf8", 30)
}

func main() {
o := orm.NewOrm()

user := User{Name: "slene"}

// insert
id, err := o.Insert(&user)
fmt.Printf("ID: %d, ERR: %v\n", id, err)

// update
user.Name = "astaxie"
num, err := o.Update(&user)
fmt.Printf("NUM: %d, ERR: %v\n", num, err)

// read one
u := User{Id: user.Id}
err = o.Read(&u)
fmt.Printf("ERR: %v\n", err)

// delete
num, err = o.Delete(&u)
fmt.Printf("NUM: %d, ERR: %v\n", num, err)
}

结果如下:

ID: 0, ERR:

NUM: 0, ERR: missed pk value

ERR: missed pk value

NUM: 0, ERR: missed pk value

[ORM] - 2014-01-14 16:27:44 - [Queries/default] - [ OK / db.Exec / 0.0ms] - [INSERT INTO user (name) VALUES (?)] - slene

共 10 个回复


jimmykuu

需要设置主键

type User struct {
    Id     int `beedb:"PK"`
    // ...
}
# 0

gogo

改成这样你说的那样,还是不行。错误是:

ID: 0, ERR:

NUM: 0, ERR: missed pk value

ERR: missed pk value

下面是建表语句:

drop table if exists User;
create table User (
Id numeric(5),
Name varchar(20),
primary key (`Id`)
);
# 1

gs272

user.Name = "astaxie"
num, err := o.Update(&user)
fmt.Printf("NUM: %d, ERR: %v\n", num, err)

这一步操作是user里面Id还是空的,所以提升没有指定主键,要重新获取完整的user才可以。 再有

type User struct {
Id int
Name string `orm:"size(100)"`
}

这里Id字段根据beego的设定是默认作为主键的。

# 2

jimmykuu

对beego不熟,可以看看一些基于beego的开源项目是怎么用的,我一般用xorm

# 3

gs272

该成下面这样应该就可以了

// update
user.Id=id
user.Name = "astaxie"
num, err := o.Update(&user)
fmt.Printf("NUM: %d, ERR: %v\n", num, err)
# 4

gogo

我试过这样也不行,不知哪位可以解决这个问题

# 5

gs272

哦,试了下,我搞错了,问题不在那。 我没用mysql,用的sqlite3,感觉应该是没建表吧。

orm.RunSyncdb("default", false, true)

不知道mysql需不需要这样建表。

# 6

gogo

这样就可以了,想问下,在beego官网上有这样的说明吗?我好像没有找到

# 7

gogo

我在源文件中找到了orm的相关函数和实现

# 8

gs272

都有的,beego官网的开发文档认真看下,很详细的,我也是新手,正在研究中!

# 9