mirror of
https://github.com/astaxie/beego.git
synced 2024-11-25 19:10:54 +00:00
Merge pull request #477 from kylemcc/read_or_create
Add a ReadOrCreate method:
This commit is contained in:
commit
8296713ba4
14
orm/orm.go
14
orm/orm.go
@ -74,6 +74,20 @@ func (o *orm) Read(md interface{}, cols ...string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Try to read a row from the database, or insert one if it doesn't exist
|
||||||
|
func (o *orm) ReadOrCreate(md interface{}, col1 string, cols ...string) (bool, int64, error) {
|
||||||
|
cols = append([]string{col1}, cols...)
|
||||||
|
mi, ind := o.getMiInd(md, true)
|
||||||
|
err := o.alias.DbBaser.Read(o.db, mi, ind, o.alias.TZ, cols)
|
||||||
|
if err == ErrNoRows {
|
||||||
|
// Create
|
||||||
|
id, err := o.Insert(md)
|
||||||
|
return (err == nil), id, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, ind.Field(mi.fields.pk.fieldIndex).Int(), err
|
||||||
|
}
|
||||||
|
|
||||||
// insert model data to database
|
// insert model data to database
|
||||||
func (o *orm) Insert(md interface{}) (int64, error) {
|
func (o *orm) Insert(md interface{}) (int64, error) {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
|
@ -1642,3 +1642,41 @@ func TestTransaction(t *testing.T) {
|
|||||||
throwFail(t, AssertIs(num, 1))
|
throwFail(t, AssertIs(num, 1))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReadOrCreate(t *testing.T) {
|
||||||
|
u := &User{
|
||||||
|
UserName: "Kyle",
|
||||||
|
Email: "kylemcc@gmail.com",
|
||||||
|
Password: "other_pass",
|
||||||
|
Status: 7,
|
||||||
|
IsStaff: false,
|
||||||
|
IsActive: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
created, pk, err := dORM.ReadOrCreate(u, "UserName")
|
||||||
|
throwFail(t, err)
|
||||||
|
throwFail(t, AssertIs(created, true))
|
||||||
|
throwFail(t, AssertIs(u.UserName, "Kyle"))
|
||||||
|
throwFail(t, AssertIs(u.Email, "kylemcc@gmail.com"))
|
||||||
|
throwFail(t, AssertIs(u.Password, "other_pass"))
|
||||||
|
throwFail(t, AssertIs(u.Status, 7))
|
||||||
|
throwFail(t, AssertIs(u.IsStaff, false))
|
||||||
|
throwFail(t, AssertIs(u.IsActive, true))
|
||||||
|
throwFail(t, AssertIs(u.Created.In(DefaultTimeLoc), u.Created.In(DefaultTimeLoc), test_Date))
|
||||||
|
throwFail(t, AssertIs(u.Updated.In(DefaultTimeLoc), u.Updated.In(DefaultTimeLoc), test_DateTime))
|
||||||
|
|
||||||
|
nu := &User{UserName: u.UserName, Email: "someotheremail@gmail.com"}
|
||||||
|
created, pk, err = dORM.ReadOrCreate(nu, "UserName")
|
||||||
|
throwFail(t, err)
|
||||||
|
throwFail(t, AssertIs(created, false))
|
||||||
|
throwFail(t, AssertIs(nu.Id, u.Id))
|
||||||
|
throwFail(t, AssertIs(pk, u.Id))
|
||||||
|
throwFail(t, AssertIs(nu.UserName, u.UserName))
|
||||||
|
throwFail(t, AssertIs(nu.Email, u.Email)) // should contain the value in the table, not the one specified above
|
||||||
|
throwFail(t, AssertIs(nu.Password, u.Password))
|
||||||
|
throwFail(t, AssertIs(nu.Status, u.Status))
|
||||||
|
throwFail(t, AssertIs(nu.IsStaff, u.IsStaff))
|
||||||
|
throwFail(t, AssertIs(nu.IsActive, u.IsActive))
|
||||||
|
|
||||||
|
dORM.Delete(u)
|
||||||
|
}
|
||||||
|
@ -23,6 +23,7 @@ type Fielder interface {
|
|||||||
// orm struct
|
// orm struct
|
||||||
type Ormer interface {
|
type Ormer interface {
|
||||||
Read(interface{}, ...string) error
|
Read(interface{}, ...string) error
|
||||||
|
ReadOrCreate(interface{}, string, ...string) (bool, int64, error)
|
||||||
Insert(interface{}) (int64, error)
|
Insert(interface{}) (int64, error)
|
||||||
InsertMulti(int, interface{}) (int64, error)
|
InsertMulti(int, interface{}) (int64, error)
|
||||||
Update(interface{}, ...string) (int64, error)
|
Update(interface{}, ...string) (int64, error)
|
||||||
|
Loading…
Reference in New Issue
Block a user