ORM SQL Alchemy, возвращающий один столбец, как избежать стандартной пост-обработки

Я использую ORM SQL Alchemy и обнаружил, что когда я возвращаю один столбец, я получаю такие результаты:

[(result,), (result_2,)] # etc...

С таким набором я обнаружил, что мне приходится делать это часто:

results = [r[0] for r in results] # So that I just have a list of result values

Это не ' Это «плохо», потому что мои наборы результатов обычно маленькие, но в противном случае это могло бы добавить значительные накладные расходы. Самое главное, я чувствую, что это загромождает источник, и пропуск этого шага - довольно частая ошибка, с которой я сталкиваюсь.

Есть ли способ избежать этого дополнительного шага?

Относящееся к делу: такое поведение орма кажется неудобным в этом случае, но в другом случае, когда мой набор результатов был [(id, value)], он заканчивается вот так:

[(result_1_id, result_1_val), (result_2_id, result_2_val)]

Затем я могу просто сделать:

results = dict(results) # so I have a map of id to value

Этот шаг имеет то преимущество, что он имеет смысл как полезный шаг после возврата результатов.

Это действительно проблема, или я просто придираюсь, и постобработка после получения набора результатов имеет смысл в обоих случаях? Я уверен, что мы можем подумать о некоторых других распространенных операциях постобработки, чтобы сделать набор результатов более удобным для использования в коде приложения. Существуют ли высокопроизводительные и удобные решения по всем направлениям, или постобработка неизбежна и просто необходима для различного использования приложений?

Когда мое приложение действительно может использовать преимущества объектов, возвращаемых ORM SQL Alchemy, это кажется чрезвычайно полезным, но в тех случаях, когда я не могу или не могу, не так много. Это обычная проблема ORM в целом? Мне лучше не использовать уровень ORM в таких случаях?

Я полагаю, мне следует показать пример реальных запросов orm, о которых я говорю:

session.query(OrmObj.column_name).all()

или

session.query(OrmObj.id_column_name, OrmObj.value_column_name).all()

Конечно, в реальном запросе там обычно были бы какие-то фильтры и т. д.

68
задан Derek Litz 28 February 2012 в 17:38
поделиться

1 ответ

Один из способов уменьшить помехи в источнике состоит в том, чтобы выполнить итерацию следующим образом:

results = [r for (r, ) in results]

Хотя это решение на один символ длиннее, чем использование оператора [], я думаю, что это проще для глаз.

Для еще меньшего количества беспорядка, удалите круглые скобки. Это затрудняет чтение кода, когда вы замечаете, что вы действительно работаете с кортежами:

results = [r for r, in results]
19
ответ дан 24 November 2019 в 14:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: