Запрос списка атрибутов вместо кортежей в 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()]