Как написать условные предложения с использованием языка выражения SQLAlchemy?

Итак, я написал довольно сложный запрос, который извлекает и объединяет кучу данных из двух таблиц.

SELECT /* Common attributes */ carrier.name, carrier.notes, carrier.turnaround, /* Either per-reseller price, generic reseller price or default price */ IFNULL( rsu.price, IF( ( carrier.reseller_price != IS NOT NULL AND carrier.reseller_price != 0 ), carrier.reseller_price, carrier.price ) ) AS price, IFNULL( rsu.price_barred, IF( ( carrier.reseller_price_barred IS NOT NULL AND carrier.reseller_price_barred != 0 ), carrier.reseller_price_barred, carrier.price_barred ) ) AS price_barred FROM `core_carrier` AS carrier LEFT OUTER JOIN `core_resellerunlock` AS rsu ON ( rsu.carrier_id = carrier.id AND rsu.reseller_id = 1 ) 

Может ли кто-то предложить способ перезаписи с помощью SQLAlchemy query builder? Я не уверен, что это возможно даже с предложениями SELECT ... IF .

Изменить: я не хочу делать это с помощью ORM (и, насколько я знаю, выполнение этого с использованием ORM SQLAlchemy чисто невозможно). Я просто ищу более или менее портативный способ сделать это с помощью ядра SQLAlchemy.

One Solution collect form web for “Как написать условные предложения с использованием языка выражения SQLAlchemy?”

Вы можете включить условие в свой запрос, используя функцию case . Это не даст точно SQL, который вы представили, но может произвести что-то функционально эквивалентное.

Вот простой пример rsu переменные- carrier и rsu ссылаются на объекты Table , а case ссылается на вышеупомянутую функцию:

 join = carrier.join(rsu, (rsu.c.carrier_id == carrier.c.id) & (rsu.c.reseller_id == 1)) query = join.select([ carrier.c.name, carrier.c.notes, carrier.c.turnaround, case([ ( rsu.c.price_barred == None, case([ ( (carrier.c.reseller_price != None) & (carrier.c.reseller_price != 0), carrier.c.reseller_price ) ], else_=carrier.c.price ) ] ]) 

Вам может показаться удобным сделать некоторые вспомогательные функции для представления функций IFNULL и IF более высокого уровня, чтобы улучшить читаемость вашего запроса. Например:

 def if_(expr, then, else_): return case([ (expr, then) ], else_=else_) 
  • Что такое хороший способ организовать ваши модели, соединения, если вы хотите использовать SQLAlchemy для подключения нескольких баз данных к различным приложениям?
  • Могу ли я использовать отношения SQLAlchemy в обратных вызовах ORM-событий? Всегда получать Нет
  • Использование меток sqlalchemy python
  • Это утечка памяти (программа в python с sqlalchemy / sqlite)
  • Лучший способ сохранить список python в базе данных?
  • Есть ли средство автоматизации SQLAlchemy, например South для Django?
  • Общий способ получения первичного ключа из декларативно определенного экземпляра в SQLAlchemy
  • sqlalchemy IS NOT NULL select
  • Python - лучший язык программирования в мире.