2015-05-06 3 views
0

Предположим, у меня есть отношение от одного до многих, определенное в sqlalchemy.Использование тернарного оператора в заявлении фильтра sqlalchemy

В моей родительской таблице есть куча детей. И у этих детей есть время начала и окончания. Время - это объекты datetime.time, в которых часы должны быть между 0 и 23. Когда время окончания происходит до начала (например, начиная с 8:00 и заканчивая в 01:00), простой запрос, такой как (Children.start_time <= search_time) & (search_time >= Children.end_time), не Работа.

Есть ли способ заставить это заявление работать?

 parent_query = Parents.join(Parents.children).filter(
       (Child.start_time <= search_time) &\ 
       (
        (
         extract('hour', Child.end_time) if\ 
         extract('hour', Child.end_time) < extract('hour', Hours.start_time) else\ 
         extract('hour', Child.end_time) + 24 
        ) 
        >= search_hour 
       ) &\ 
       (Child.end_time.minute >= search_minute) 
       ) 

Я получаю TypeError: Boolean value of this clause is not defined

ответ

3

Вы должны использовать CASE заявление:

case([ 
    (extract('hour', Child.end_time) < extract('hour', Hours.start_time), extract('hour', Child.end_time)) 
], else_=extract('hour', Child.end_time) + 24) 
+0

Хороший ответ, но вы также можете объяснить, почему тройной оператор не работает. Причина в том, что при использовании 'if' /' else' Python пытается оценить условие ветвления во время определения запроса, что не имеет смысла. Использование 'case()' добавляет условие к SQL запроса. – augurar

Смежные вопросы