我可以为不同的视图创建单独的查询吗?

时间:2012-07-08 22:10:04

标签: sqlalchemy

我正在学习sqlalchemy并且不确定我是否完全掌握它(我更习惯于手工编写查询但我喜欢抽象查询和获取对象的想法)。我正在阅读本教程,并尝试将其应用于我的代码,并在定义模型时遇到了这个部分:

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

它非常有用,因为我可以只搜索用户名并获取有关我想要的用户的信息,但有没有办法让我可以调用多种这类视图?或者我使用它是错误的,应该编写一个特定的查询来获取不同视图的不同数据?

为什么我要求我的网站有不同的模板,大多数页面只需要用户名,名/姓,但有些页面需要twitter或Facebook网址(也是模型中的字段)。< / p>

1 个答案:

答案 0 :(得分: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列,此时将执行针对数据库的另一个查询加载缺失的数据 但是,如果您在查询Book之前就知道需要立即使用列photo,则仍然可以使用“未更改”选项覆盖延迟行为:query = session.query(Book).options(undefer('photo')).get(1)

基本上,这里的建议是推迟所有列(在您的情况下:除了用户名,密码等),并在每个用例(视图)覆盖undefer您知道的那些你需要特定的观点。另请参阅group的{​​{1}}参数,以便您可以按用例(视图)对属性进行分组。

另一种方法是仅查询某些列,但在这种情况下,您将获得deferred实例而不是模型实例(在您的情况下为tuple),因此表单可能正常填充,但不太适合模型验证:User