package utils import ( "errors" "github.com/go-xorm/xorm" "reflect" ) // 分页插入数据库 func Insert(db *xorm.Engine, beans ...interface{}) error { return InsertWithSize(db, 500, beans...) } func InsertWithSize(db *xorm.Engine, size int, beans ...interface{}) error { if nil == db { return errors.New(`db can not be nil`) } if nil == beans || len(beans) == 0 { return nil } trans := db.NewSession() defer trans.Close() _ = trans.Begin() err := TransInsertWithSize(trans, size, beans...) if nil != err { _ = trans.Rollback() return err } return trans.Commit() } func TransInsert(trans *xorm.Session, beans ...interface{}) error { return TransInsertWithSize(trans, 500, beans...) } func TransInsertWithSize(trans *xorm.Session, size int, beans ...interface{}) error { if nil == trans { return errors.New(`trans can not be nil`) } if nil == beans || len(beans) == 0 { return nil } if size < 100 { size = 500 } var objects []interface{} for _, bean := range beans { sliceValue := reflect.Indirect(reflect.ValueOf(bean)) if sliceValue.Kind() == reflect.Slice { for i := 0; i < sliceValue.Len(); i++ { v := sliceValue.Index(i) elemValue := v.Interface() objects = append(objects, elemValue) } } else { objects = append(objects, bean) } } total := len(objects) var err error if total <= size { _, err = trans.Insert(&objects) return err } for i := 0; i < total; i += size { end := i + size if end > total { end = total } arr := objects[i:end] _, err = trans.Insert(&arr) if nil != err { return err } } return err }