// Insert inserts an item (map or struct) into the collection. func (t *table) Insert(item interface{}) (interface{}, error) { columnNames, columnValues, err := sqlbuilder.Map(item, nil) if err != nil { return nil, err } pKey := t.BaseCollection.PrimaryKeys() q := t.d.InsertInto(t.Name()). Columns(columnNames...). Values(columnValues...) if len(pKey) == 0 { // There is no primary key. var res sql.Result if res, err = q.Exec(); err != nil { return nil, err } // Attempt to use LastInsertId() (probably won't work, but the Exec() // succeeded, so we can safely ignore the error from LastInsertId()). lastID, _ := res.LastInsertId() return lastID, nil } // Asking the database to return the primary key after insertion. q.Returning(pKey...) var keyMap db.Cond if err = q.Iterator().One(&keyMap); err != nil { return nil, err } // The IDSetter interface does not match, look for another interface match. if len(keyMap) == 1 { return keyMap[pKey[0]], nil } // This was a compound key and no interface matched it, let's return a map. return keyMap, nil }
// Insert inserts an item (map or struct) into the collection. func (t *table) Insert(item interface{}) (interface{}, error) { columnNames, columnValues, err := sqlbuilder.Map(item, nil) if err != nil { return nil, err } pKey := t.BaseCollection.PrimaryKeys() q := t.d.InsertInto(t.Name()). Columns(columnNames...). Values(columnValues...) var res sql.Result if res, err = q.Exec(); err != nil { return nil, err } if len(pKey) <= 1 { // Attempt to use LastInsertId() (probably won't work, but the Exec() // succeeded, so we can safely ignore the error from LastInsertId()). lastID, _ := res.LastInsertId() return lastID, nil } keyMap := db.Cond{} for i := range columnNames { for j := 0; j < len(pKey); j++ { if pKey[j] == columnNames[i] { keyMap[pKey[j]] = columnValues[i] } } } return keyMap, nil }