[英]sqlalchemy, hybrid property case statement
這是我試圖通過sqlalchemy生成的查詢
SELECT "order".id AS "id",
"order".created_at AS "created_at",
"order".updated_at AS "updated_at",
CASE
WHEN box.order_id IS NULL THEN "special"
ELSE "regular" AS "type"
FROM "order" LEFT OUTER JOIN box ON "order".id = box.order_id
在sqlalchemy的文檔之后,我嘗試使用hybrid_property來實現這一點。 這就是我到目前為止所做的,而且我沒有得到正確的陳述。 它沒有正確生成案例陳述。
from sqlalchemy import (Integer, String, DateTime, ForeignKey, select, Column, create_engine)
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.hybrid import hybrid_property
Base = declarative_base()
class Order(Base):
__tablename__ = 'order'
id = Column(Integer, primary_key=True)
created_at = Column(DateTime)
updated_at = Column(DateTime)
order_type = relationship("Box", backref='order')
@hybrid_property
def type(self):
if not self.order_type:
return 'regular'
else:
return 'special'
class Box(Base):
__tablename__ = 'box'
id = Column(Integer, primary_key=True)
monthly_id = Column(Integer)
order_id = Column(Integer, ForeignKey('order.id'))
stmt = select([Order.id, Order.created_at, Order.updated_at, Order.type]).\
select_from(Order.__table__.outerjoin(Box.__table__))
print(str(stmt))
對於非平凡的表達式,hybrid屬性必須包含兩個部分:Python getter和SQL表達式。 在這種情況下,Python端將是一個if語句,SQL端將是一個case表達式 。
from sqlalchemy import case
from sqlalchemy.ext.hybrid import hybrid_property
@hybrid_property
def type(self):
return 'special' if self.order_type else 'regular'
@type.expression
def type(cls):
return case({True: 'special', False: 'regular'}, cls.order_type)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.