code: func (c *shellQueryClient) Read(ctx context.Context, ops []*queryObj, fields []string, limit int) ([]map[string]dosa.FieldValue, error) {
  	// look up entity in the registry
  	re, _ := c.registrar.Find(&dosa.Entity{})
  
  	// build arguments for read with expressions
  	fvs, err := buildReadArgs(ops)
  	if err != nil {
  		return nil, err
  	}
  
  	// convert the field names to column names
  	columns, err := re.ColumnNames(fields)
  	if err != nil {
  		return nil, err
  	}
  
  	res, err := c.connector.Read(ctx, re.EntityInfo(), fvs, columns)
  
  	return convertColToField([]map[string]dosa.FieldValue{res}, re.Table().ColToField), err
  }
docs: // Read fetches a row by primary key.