Запрос списка атрибутов вместо кортежей в SQLAlchemy
Я запрашиваю идентификаторы модели и получаю список (int,)
кортежей, а не список идентификаторов. Есть ли способ напрямую запрашивать атрибут?
result = session.query(MyModel.id).all()
Я понимаю, что можно сделать
results = [r for (r,) in results]
Возможно ли, чтобы запрос возвращал эту форму напрямую, вместо того, чтобы обрабатывать ее самостоятельно?
- Функция вызова Python внутри classа
- Конкатенация строк без оператора «+»
- Использование «readlines ()» дважды подряд
- Как сопоставить числовые данные в категории / корзины в кадре данных Pandas
- Сравните два файла CSV и выполните поиск похожих элементов
- Использование 100% всех ядер с модулем многопроцессорности
- Определить метод вне определения classа?
- Почему я не могу использовать метод __cmp__ в Python 3 как для Python 2?
- Как проверить, существует ли файл?
- Как скомпилировать приложение Python 3 в .exe?
- Как читать CSV-данные в массив записей в NumPy?
- Как определить двумерный массив в Python
- Pandas получают самые высокие n записей в каждой группе
При передаче в ORM-инструментальных дескрипторах, таких как столбец, каждый результат является именованным кортежем , даже для одного столбца. Вы можете использовать имя столбца в понимании списка, чтобы «сгладить» список (вы можете удалить .all()
, итерация также извлекает объекты):
result = [r.id for r in session.query(MyModel.id)]
или использовать тот факт, что он является кортежем при циклизации цикла for
и распаковывает его в одноэлементный набор целей:
result = session.query(MyModel.id) for id, in result: # do something with the id
Последнее также может использоваться в понимании списка:
[id for id, in session.query(MyModel.id)]
У вас на самом деле нет никаких параметров, чтобы заставить результаты строк быть только одним значением id
.
Странно, что SQLalchemy не обеспечивает правильное решение. В sqlalchemy, если выбрать переменную-член, такую как столбец, тогда каждый результат является именованным кортежем, как сказал @Martijn. Я пришел к решению для этого, используя zip-функцию python
Официальная документация Zip
zip (seq1 [, seq2 […]]) -> [(seq1 [0], seq2 [0] …), (…)] Возвращает список кортежей, где каждый кортеж содержит i- го элемента из каждой из последовательностей аргументов. Возвращаемый список усекается по длине с длиной кратчайшей последовательности аргументов.
Приходите к вашему примеру
result = session.query(MyModel.id).all() result = zip(*result)[0]
Вывод:
[id1, id2, id3...]
Как он будет работать, он сгладит список кортежей, заданных как аргумент, если вы передадите список, как
[(key11, key21), (key12,key22)]
Zip преобразует этот список кортежей в
[(key11, key12), (key21, key22)]
В вашем случае вы хотите, чтобы каждое начальное значение tupe было из MyModel, поэтому вы можете взять 0-й кортеж из списка.