AWS cli делает это (предположительно, не выбирая и не повторяя все ключи в ковше), когда вы запускаете aws s3 ls s3://my-bucket/
, поэтому я решил, что должен быть способ с помощью boto3.
Похоже, что они действительно используют префикс и разделитель - I смог написать функцию, которая доставит мне все каталоги на корневом уровне ведра, немного изменив этот код:
def list_folders_in_bucket(bucket):
paginator = boto3.client('s3').get_paginator('list_objects')
folders = []
iterator = paginator.paginate(Bucket=bucket, Prefix='', Delimiter='/', PaginationConfig={'PageSize': None})
for response_data in iterator:
prefixes = response_data.get('CommonPrefixes', [])
for prefix in prefixes:
prefix_name = prefix['Prefix']
if prefix_name.endswith('/'):
folders.append(prefix_name.rstrip('/'))
return folders
queryForMap
подходит, если вы хотите получить один ряд. Вы выбираете без предложения where
, так что вы, вероятно, хотите queryForList
. Ошибка, вероятно, свидетельствует о том, что queryForMap
требуется одна строка, но ваш запрос извлекает много строк.
Ознакомьтесь с документами. Существует queryForList
, который занимает только sql; тип возвращаемого значения -
List<Map<String,Object>>
.
Итак, когда у вас есть результаты, вы можете делать то, что делаете. Я хотел бы сделать что-то вроде
List results = template.queryForList(sql);
for (Map m : results){
m.get('userid');
m.get('username');
}
Я позволю вам заполнить детали, но я бы не стал перебирать ключи в этом случае. Мне нравится подробно рассказывать о том, что я ожидаю.
Если у вас есть объект User
, и вы действительно хотите загрузить пользовательские экземпляры, вы можете использовать queryForList
, который принимает sql, и тип класса
queryForList(String sql, Class<T> elementType)
(Вау, весна сильно изменилась с тех пор, как я покинул Джаваланд.)
Чтобы добавить ответ @ BrianBeech, это еще более урезано в Java 8:
jdbcTemplate.query("select string1,string2 from table where x=1", (ResultSet rs) -> {
HashMap<String,String> results = new HashMap<>();
while (rs.next()) {
results.put(rs.getString("string1"), rs.getString("string2"));
}
return results;
});
Я знаю, что это действительно старый, но это самый простой способ запросить карту.
Просто реализуйте интерфейс ResultSetExtractor, чтобы определить, какой тип вы хотите вернуть. Ниже приведен пример того, как использовать это. Вы будете составлять карту вручную, но для простой карты она должна быть простой.
jdbcTemplate.query("select string1,string2 from table where x=1", new ResultSetExtractor<Map>(){
@Override
public Map extractData(ResultSet rs) throws SQLException,DataAccessException {
HashMap<String,String> mapRet= new HashMap<String,String>();
while(rs.next()){
mapRet.put(rs.getString("string1"),rs.getString("string2"));
}
return mapRet;
}
});
Это даст вам возвращаемый тип карты с несколькими строками (сколько бы ни было возвращено вашего запроса), а не список карт. Вы можете просмотреть документы ResultSetExtractor здесь: http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/jdbc/core/ResultSetExtractor.html