Я использую ORM в SQL Alchemy и нахожу, что, возвращая один столбец, я получаю результаты примерно так:
[(result,), (result_2,)] # etc...
С таким набором я нахожу, что мне приходится делать это часто:
results = [r[0] for r in results] # So that I just have a list of result values
Это не так уж и плохо, потому что мои наборы результатов, как правило, маленькие, но если бы их не было, это могло бы привести к значительным накладным расходам. Самое главное, я чувствую, что это загромождает источник, и пропустить этот шаг - довольно распространенная ошибка, с которой я сталкиваюсь.
Есть ли способ избежать этого дополнительного шага?
Смежный в стороне: это поведение orm кажется неудобным в этом случае, но в другом случае, когда мой набор результатов был, [(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()
Конечно, в реальном запросе обычно есть несколько фильтров и т. Д.