2011-10-10 43 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