Last active
December 24, 2017 04:58
-
-
Save asm-jaime/bb42ccfaa2a0c291d63ca89a2b324c8c to your computer and use it in GitHub Desktop.
go mgo mongodb+test example, test insert same data to unique key
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
mgo "gopkg.in/mgo.v2" | |
"gopkg.in/mgo.v2/bson" | |
"time" | |
) | |
// ========== model | |
type Cargo struct { | |
Id bson.ObjectId `form:"id" bson:"_id,omitempty"` | |
Value string `form:"value" bson:"value"` | |
} | |
// ========== mongo | |
type MongoDB struct { | |
Host string | |
Port string | |
Addrs string | |
Database string | |
EventTTLAfterEnd time.Duration | |
StdEventTTL time.Duration | |
Info *mgo.DialInfo | |
Session *mgo.Session | |
} | |
func ConfigureMongo(mongo *MongoDB) (err error) {// {{{ | |
mongo.Port = "27017" | |
mongo.Host = "localhost" | |
mongo.Addrs = mongo.Host + ":" + mongo.Port | |
mongo.Database = "test" | |
mongo.EventTTLAfterEnd = 1 * time.Second | |
mongo.StdEventTTL = 20 * time.Minute | |
mongo.Info = &mgo.DialInfo{ | |
Addrs: []string{mongo.Addrs}, | |
Timeout: 60 * time.Second, | |
Database: mongo.Database, | |
} | |
// first connect, and next requests only clones this session | |
mongo.Session, err = mgo.DialWithInfo(mongo.Info) | |
if err != nil { | |
mongo.Session, err = mgo.Dial(mongo.Host) | |
} | |
return err | |
} | |
func (mongo *MongoDB) Drop() (err error) { | |
session := mongo.Session.Clone() | |
defer session.Close() | |
err = session.DB(mongo.Database).DropDatabase() | |
return err | |
} | |
func (mongo *MongoDB) Init() (err error) { | |
session := mongo.Session.Clone() | |
defer session.Close() | |
session.EnsureSafe(&mgo.Safe{}) | |
collection := session.DB(mongo.Database).C("cargo") | |
index := mgo.Index{ | |
Key: []string{"value"}, | |
Unique: true, | |
Background: true, | |
Sparse: true, | |
} | |
err = collection.EnsureIndex(index) | |
return err | |
} | |
// ========== methods | |
func (mongo *MongoDB) GetCargo() (cargos []Cargo, err error) { | |
session := mongo.Session.Clone() | |
defer session.Close() | |
err = session.DB(mongo.Database).C("cargo").Find(bson.M{}).All(&cargos) | |
return cargos, err | |
} | |
func (mongo *MongoDB) PostCargo(cargo *Cargo) (err error) { // {{{ | |
session := mongo.Session.Clone() | |
defer session.Close() | |
err = session.DB(mongo.Database).C("cargo").Insert(&cargo) | |
return err | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
gen "github.com/asm-jaime/gen" | |
"testing" | |
) | |
func dbTest() (mongo *MongoDB) { | |
mongo = &MongoDB{} | |
err := ConfigureMongo(mongo) | |
if err != nil { | |
panic("db does not allow set any session. \n" + | |
"here is a problem with config params or database") | |
} | |
err = mongo.Drop() | |
if err != nil { | |
panic("db does not allow drop.") | |
} | |
err = mongo.Init() | |
if err != nil { | |
panic("db does not allow init.") | |
} | |
return mongo | |
} | |
func Test2xSamePost(t *testing.T) { | |
db := dbTest() | |
cargo := Cargo{} | |
cargo.Value = gen.StrNums(8) | |
err := db.PostCargo(&cargo) | |
if err != nil { | |
t.Error("first insert err: ", err) | |
} | |
err = db.PostCargo(&cargo) | |
if len(err.Error()) > 6 && err.Error()[0:6] == "E11000" { | |
// fmt.Println(err) | |
} else { | |
t.Error("this err is not proper error, ", err) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment