从SQLAlchemy中的查询返回“计算”列

时间:2013-11-19 03:22:15

标签: postgresql sqlalchemy flask-sqlalchemy

说我有以下课程:

class Basket(db.Model):
    id = Column('id', Integer, primary_key=True)

class Fruit(db.Model):
    id = Column('id', Integer, primary_key=True)
    basket_id = Column(Integer, ForeignKey('basket.id'))

我想对fruit表进行查询,该表在其结果中返回一个名为in_basket的“计算”列,如果水果的Truebasket_id则为[1, 2, 3]在篮子ID列表中False和{{1}}。

有没有办法在SQLAlchemy中执行此操作?我正在使用flask-sqlalchemy和Postgres 9。

感谢。

1 个答案:

答案 0 :(得分:1)

使用case表达式应该是直截了当的:

class Fruit(...):
    ...
    def is_in_basket(self, busket_list):
        return self.basket_id in busket_list

def get_fruits(basket_list):
    from sqlalchemy.sql.expression import case
    xpr = case([(Fruit.basket_id.in_(basket_list), True),], else_ = False).label("in_basket")
    qry = session.query(Fruit, xpr)
    fruits = []
    for fruit, in_basket in qry:
        fruit.in_basket = in_basket # assign value to a Fruit property (as per comment below)
        fruits.append(fruit)
    return fruits

fruits = get_fruits(my_basket_list)
for f in fruits:
    print f, f.in_basket, f.is_in_basket(my_basket_list)