Запрос списка атрибутов вместо кортежей в SQLAlchemy
Я запрашиваю идентификаторы модели и получаю список кортежей (int,)
, а не список идентификаторов. Есть ли способ напрямую запросить атрибут?
result = session.query(MyModel.id).all()
Я понимаю, что можно сделать
results = [r for (r,) in results]
Возможно ли, чтобы запрос возвращал эту форму напрямую, вместо того, чтобы обрабатывать ее самостоятельно?
Ответы
Ответ 1
При передаче в 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
.
Ответ 2
Странно, что SQLalchemy не дает правильного решения. В sqlalchemy, если выбрать переменную-член, такую как столбец, то каждый результат является именованным кортежем, как сказал @Martijn. Я пришел к решению для этого с помощью функции почтового индекса Python
Официальная документация на молнии
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-й кортеж из списка.
Ответ 3
q_stringlist = [q[0] for q in session.query((distinct(Table.column))).all()]
для Flask SQLAlchemy
q_stringlist = [q[0] for q in db.session.query((distinct(Table.column))).all()]