使用ORM时的情况(SQLalchemy)

Ood*_*ini 27 python orm sqlalchemy

我正在使用SQLAlchemy和ORM paragdim.我无法找到一种方法来执行CASE WHEN指令.我在网上找不到这方面的信息.

可能吗 ?

van*_*van 44

请参阅文档页面上的sqlalchemy.sql.expression.case函数和更多示例.但它看起来像这样(逐字链接到文档):

case([(orderline.c.qty > 100, item.c.specialprice),
      (orderline.c.qty > 10, item.c.bulkprice)
    ], else_=item.c.regularprice)
case(value=emp.c.type, whens={
        'engineer': emp.c.salary * 1.1,
        'manager':  emp.c.salary * 3,
    })
Run Code Online (Sandbox Code Playgroud)

编辑1 :( 回答评论)当然可以,见下面的例子:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True, autoincrement=True)
    first_name = Column(String)
    last_name = Column(String)

xpr = case([(User.first_name != None, User.first_name + " " + User.last_name),],
        else_ = User.last_name).label("full_name")

qry = session.query(User.id, xpr)
for _usr in qry:
    print _usr.fullname
Run Code Online (Sandbox Code Playgroud)

另请参阅使用混合作为case混合属性中使用的示例.

  • `NotImplementedError: Operator 'getitem' is notsupported on this expression` 看来,如果你只有一个when,你需要将它作为一个可迭代对象传入。当我阅读文档时,我并不清楚这一点,但我从你的回答中弄清楚了。谢谢。 (2认同)

Lay*_*yla 8

在本例中,我让它与聚合函数一起使用func.sum

我的示例代码

from sqlalchemy import func, case

my_case_stmt = case(
    [
        (MyTable.hit_type.in_(['easy', 'medium']), 1),
        (MyTable.hit_type == 'hard', 3)
    ]
)

score = db.session.query(
    func.sum(my_case_stmt)
).filter(
    MyTable.success == 1
)

return score.scalar()
Run Code Online (Sandbox Code Playgroud)

我的用例

我的表看起来像这样:

|   hit_type     |  success |  
-----------------------------  
|   easy         |   1      |  
|   medium       |   1      |  
|   easy         |   0      |  
|   hard         |   1      |  
|   easy         |   0      |
|   easy         |   1      |  
|   medium       |   1      |  
|   hard         |   1      |
Run Code Online (Sandbox Code Playgroud)

score计算如下: score = num_easy_hits + num_medium_hits + (3 * num_hard_hits)

4 次成功的简单/中度打击和 2 次成功的困难打击将为您提供(4 + (2*3)) = 10