code: def insert(self, data):
          
          row = {key:self._default_entry for key in self._headers}
          row['_uid'] = self._get_new_uid()
  
          for key, val in data.items():
              if key in ('_uid', '_default'):
                  logging.warn("Cannot manually set columns _uid or _default of a row! Given data: {0}".format(data))
                  continue
              if not isinstance(val, CSVModel._KNOWN_TYPES_MAP[self._headers_types[key]]):
                  raise Exception('Data type mismatch for column {0}. Expected: {1}, got: {2}'.format(key,
                                                          CSVModel._KNOWN_TYPES_MAP[self._headers_types[key]], type(val)))
              row[key] = val
  
          self._table.append(row)
          self._save()
          return row['_uid']
docs: Insert a row into the .csv file.
  
          Parameters
          ----------
          data : :obj:`dict`
              A dictionary mapping keys (header strings) to values.
  
          Returns
          -------
          int
              The UID for the new row.
  
          Raises
          ------
          Exception
              If the value for a given header is not of the appropriate type.