#sqlalchemy #flask-sqlalchemy
#sqlalchemy #flask-sqlalchemy
Вопрос:
У меня есть таблица с тремя столбцами: segment_num
, pass_num
, is_done
. pass_num
представляет собой набор (0,1). Для каждого segment_num
есть набор всех pass_nums
(два раза), что означает, что для каждого есть 4 строки segment_num
. is_done
может быть true или false.
segment_num pass_num is_done
1000 0 True
1000 1
1000 0 True
1000 1
1001 0 True
1001 1
1001 0 False
1001 1
1002 0 False
1002 1
1002 0 False
1002 1
Для простоты я не заполнял is_done
поля для строк, которые не имеют значения. Я хочу запросить все segment_num
s, у которых есть хотя бы один is_done=True для pass_num 0 .
Итак, в этом примере 1000 и 1001 имеют по крайней мере один (pass_num=0 и is_done=True). Таким образом, результат должен быть 1000 и 1001.
Я думаю, что я должен использовать group_by для каждого segment_num и в каждой группе я должен решить, следует ли сохранить segment_num или игнорировать его на основе значения is_done для pass_num= 0 в нем. Я бы предпочел написать это в Sqlalchemy ORM. Любая помощь была бы очень признательна.
Пока у меня есть это:
db.session.query(Mytable).group_by(Mytable.segment_num).all()
Я не уверен, как добавить условие в group_by.
Ответ №1:
Пример SQL в MySQL будет:
select segment_num from mytable where pass_num=0 and is_done=True group by
segment_num;
Итак, чтобы сделать это в SQLAlchemy
Импорт и_:
from sqlalchemy import and_
А затем получаем результат:
segments = db.session.query(MyTable.segment_num)
.filter(and_(MyTable.pass_num == 0,
MyTable.is_done == True))
.group_by(MyTable.segment_num).all()
который даст вам значения для одного столбца segment_num, сгруппированные по значениям.