2011-10-10 57 views
1

所以我有表,我希望用户能够以任何他们喜欢的顺序查看表。这里有一个例子:了解SQLAlchemy中的中间SQL语句

class Thing(Base): 
    __tablename__ = 'thing' 
    id = Column(Integer, primary_key=True) 
    amount = Column(Integer) 
    date = Column(DateTime, default=datetime.now()) 

    def __init__(self, amount): 
     self.amount = amount 

所以我想提出以下查询:

if sort == 'amount': 
    orderby = Thing.amount.desc() 
elif sort == 'date': 
    orderby = Thing.date.desc() 

things = DBSession.query(Thing).order_by(orderby).all() 

主要问题:

  1. 当我设置的排序依据声明,我是实际调用什么或者是刚刚设置的陈述?
  2. 我是否正确和有效地做到这一点?
  3. 我可以用过滤器做类似的工作吗?

    filterby = Thing.amount == 5

    东西= DBSession.query(事).filter_by(filterby)。所有()

谢谢!

回答

3

答1: 当你给予任何语法正是它会回报你可以用类型的语法检查一样

当你写

In [5]: Thing.amount.desc() 
Out[5]: <sqlalchemy.sql.expression._UnaryExpression object at 0x199a5d0> 

这将创建一个对象类型expression._UnaryExpression。所以当我们想要一元操作时,你可以给sqlalchemy这个表达式。现在,当你打印 在文献[6]:A = Thing.amount.desc()

In [7]: print a 
thing.amount DESC 

因此,当查询运行将在thing.amount DESC转换。所以当你创建表达式时它不会调用任何东西,它只会创建查询结构。

Ans:2 当您创建查询时,它将创建所需的对象。对于过滤和排序,它需要表达式,所以如果你直接传递给order_byfilter,那么它会在内部创建相同的对象。所以你可以使用两种方式。

答:3

In [8]: Thing.amount == 5 
Out[8]: <sqlalchemy.sql.expression._BinaryExpression object at 0x1a1dbd0> 

这也是一种表达,所以你可以给表达filter_by

你会得到更多的想法来自SQLAlchemy的网站约expression