了解SQLAlchemy中的中间SQL语句

时间:2011-10-10 23:45:53

标签: python sql sqlalchemy pyramid

所以我有桌子,我想让用户能够以他们喜欢的顺序查看表格。这是一个例子:

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. 当我设置orderby语句时,我实际上是在调用任何内容还是正在设置语句?
  2. 我这样做是否正确有效?
  3. 我可以使用过滤器进行类似的操作吗?

    filterby = Thing.amount == 5

    things = DBSession.query(Thing).filter_by(filterby).all()

  4. 谢谢!

1 个答案:

答案 0 :(得分: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中转换。因此,当你创建表达式时,它不会调用任何东西,它只会创建查询结构。

答案:2 在创建查询时,它将创建所需的对象。对于过滤器和顺序,需要表达式,所以如果直接传递给order_byfilter,那么它将在内部为它创建对象。所以你可以两种方式使用。

答案:3

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

这也是一个表达式,因此您可以将表达式赋予filter_by

您将从sqlalchemy网站了解expression