2012-07-08 93 views
1

我正在學習sqlalchemy,不知道我是否完全掌握它(我更習慣於手寫查詢,但我喜歡抽象查詢和獲取對象的想法)。我經歷的教程,並試圖將其應用到我的代碼,衝進這部分定義模型時:我可以爲不同視圖創建查詢語句嗎?

def __repr__(self): 
    return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password) 

它非常有用,因爲我可以只搜索用戶名,並得到大約只有用戶信息我想要的但有沒有辦法讓我可以調用這些類型的視圖中的多個?還是我用它錯了,應該寫一個特定的查詢來獲取不同視圖的不同數據?

爲什麼我要求我的網站有不同的模板,大多數網頁只需要用戶名,名字/姓氏,但有些網頁需要諸如Twitter或Facebook網址(模型中的字段)等內容。

回答

2

首先,__repr__不是一個視圖,所以如果你有一個簡單的模型User與定義的列,並且您查詢一個User,所有列將得到從數據庫加載,而不是隻有那些在__repr__使用。

讓我們模型Book(來自稍後所指向的例子),其爲基礎:

class Book(Base): 
    book_id = Column(Integer, primary_key=True) 
    title = Column(String(200), nullable=False) 
    summary = Column(String(2000)) 
    excerpt = Column(Text) 
    photo = Column(Binary) 

跳過加載某些列是使用Deferred Column Loading第一個選項:

class Book(Base): 
    # ... 
    excerpt = deferred(Column(Text)) 
    photo = deferred(Column(Binary)) 

在這種情況下當您執行查詢session.query(Book).get(1)時,將不會加載photoexcerpt列,直到從代碼訪問爲止,此時將執行鍼對數據庫的另一個查詢以加載missi ng數據。
但是,如果您在查詢Book之前知道立即需要列photo,那麼仍可以用undefer選項覆蓋延遲行爲:query = session.query(Book).options(undefer('photo')).get(1)

基本上,這裏的建議是延遲所有列(在你的情況:除了用戶名,密碼等),並在每個用例(視圖)覆蓋與undefer那些你知道你需要爲特定視圖。另請參閱deferredgroup參數,以便您可以按用例(視圖)對屬性進行分組。

另一種方法是隻查詢某些列,但在這種情況下,你所得到的tuple實例,而不是模型實例(在你的情況User),所以它是表格填寫潛在OK,但不是那麼好模型驗證:session.query(Book.id, Book.title).all()

相關問題