Запрос списка атрибутов вместо кортежей в SQLAlchemy

Я запрашиваю идентификаторы модели и получаю список (int,) кортежей, а не список идентификаторов. Есть ли способ напрямую запрашивать атрибут?

 result = session.query(MyModel.id).all() 

Я понимаю, что можно сделать

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

Возможно ли, чтобы запрос возвращал эту форму напрямую, вместо того, чтобы обрабатывать ее самостоятельно?

При передаче в 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-й кортеж из списка.

  • Установка разного цвета для каждой серии в поле рассеяния на matplotlib
  • Как читать текстовый файл в список или массив с помощью Python
  • Apt-offline в Windows
  • Можно ли векторизовать рекурсивный расчет массива NumPy, где каждый элемент зависит от предыдущего?
  • Как найти числовые столбцы в Pandas?
  • Разрешение Отказано в выполнении сценария python из samba share
  • Как повторить попытку после исключения?
  • Yum erase python = разрушение
  • Доступ к клавишам dict, как атрибут?
  • Подсчитайте число вхождений символа в строку
  • Как суммировать все значения в словаре?
  • Interesting Posts
    Давайте будем гением компьютера.