Я использую 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()
Конечно, в реальном запросе там обычно были бы какие-то фильтры и т. д.
Один из способов уменьшить помехи в источнике состоит в том, чтобы выполнить итерацию следующим образом:
results = [r for (r, ) in results]
Хотя это решение на один символ длиннее, чем использование оператора []
, я думаю, что это проще для глаз.
Для еще меньшего количества беспорядка, удалите круглые скобки. Это затрудняет чтение кода, когда вы замечаете, что вы действительно работаете с кортежами:
results = [r for r, in results]