code: func primaryKey(s interface{}) (key string, value interface{}) {
  	val := reflect.Indirect(reflect.ValueOf(s))
  	for i := 0; i < val.NumField(); i++ {
  		fieldValue := val.Field(i)
  		fieldType := val.Type().Field(i)
  		// Handle embedded anonymous struct only
  		switch fieldValue.Kind() {
  		case reflect.Struct:
  			if fieldType.Anonymous {
  				key, value = primaryKey(fieldValue.Interface())
  			}
  		default:
  			tag := strings.ToLower(fieldType.Tag.Get("igor"))
  			tagValue := strings.Split(tag, ",")
  			sort.Strings(tagValue)
  			idx := sort.SearchStrings(tagValue, "primary_key")
  			if idx < len(tagValue) && tagValue[idx] == "primary_key" {
  				key = fieldType.Name
  				value = fieldValue.Interface()
  				return
  			}
  		}
  	}
  	return
  }
docs: // primaryKey returns the pair (key, value) representing the defined primary key field
  // (key) and its value (value), when the `sql` struct tag field is defined and is value is not blank
  // returns empty key if a key is not present and thus en empty value
  // oterwise returns the key and the value (if present, i.e. is not blank)
  // returned Key is the Name of the field. Not following the sql conventions but the go convention.
  // If you need to change this value (and you usually do), parse key with handleIdentifier