func getListField(db *sql.DB, table string, item string, field string) (string, error) {
  tableName := listFieldToTableName(table, field)
  if !TableExists(db, tableName) {
    return "", errors.New(fmt.Sprintf("list field %s does not exist in table %s", field, table))
  }
  if !FieldExists(db, tableName, field) {
    return "", errors.New(fmt.Sprintf("internal error, %s does not have a field %s", tableName, field))
  }
  todo not working
  if HasListFieldValue(db, tableName, item, field) {
    return "", errors.New(fmt.Sprintf("NULL list field %s of item %s in table %s", field, item, table))
  }
  rows, err := db.Query(fmt.Sprintf(`SELECT ? FROM "%s" WHERE Owner=?`, tableName), field, item)
  if err != nil {
    return "", errors.New(fmt.Sprintf("list field %s of item %s in table %s not found: %s", field, item, table, err))
  }
  results := make([]string, 0)
  for rows.Next() {
    var datum sql.NullString
    if err := rows.Scan(&datum); err != nil {
      rows.Close()
      return "", errors.New(fmt.Sprintf("cannot retrieve list field %s of item %s in table %s: %s", field, item, table, err))
    }
    if !datum.Valid {
      rows.Close()
      return "", errors.New(fmt.Sprintf("NULL for field %s of item %s in table %s", field, item, table))
    }
    results = append(results, datum.String)
  }
  rows.Close()
  if err := rows.Err(); err != nil {
    return "", errors.New(fmt.Sprintf("cannot retrieve list field %s of item %s in table %s: %s", field, item, table, err))
  }
  return strings.Join(results, "\n"), nil
}