0

私はsqlalchemyを学んでいて、それを完全に理解しているかどうかはまだわかりません(私は手作業でクエリを書くことに慣れていますが、クエリを抽象化してオブジェクトを取得するというアイデアが好きです)。私はチュートリアルを実行し、それをコードに適用しようとして、モデルを定義するときにこの部分に遭遇しました。

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

ユーザー名を検索して、必要なユーザーに関する情報のみを取得できるので便利ですが、これらのタイプのビューを複数持つ方法はありますか?または、間違って使用していて、ビューごとに異なるデータを取得するための特定のクエリを作成する必要がありますか?

私が自分のサイトに異なるテンプレートを要求している理由のいくつかのコンテキスト。ほとんどのページにはユーザー名、姓名のみが必要ですが、一部のページにはTwitterやFacebookのURL(モデルのフィールドも)などが必要です。

4

1 に答える 1

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)

一部の列の読み込みをスキップする最初のオプションは、遅延列の読み込みを使用することです。

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

この場合、クエリを実行するsession.query(Book).get(1)と、コードからアクセスされるまで列photoexcerpt列が読み込まれません。その時点で、データベースに対する別のクエリが実行され、不足しているデータが読み込まれます。
ただし、クエリを実行する前に、すぐにBook列が必要であることがわかっている場合photoでも、undeferオプションを使用して遅延動作をオーバーライドできますquery = session.query(Book).options(undefer('photo')).get(1)

基本的に、ここでの提案は、すべての列(あなたの場合:ユーザー名、パスワードなどを除く)を延期undeferし、各ユースケース(ビュー)で、その特定のビューに必要であることがわかっている列でオーバーライドすることです。ユースケース(ビュー)ごとに属性をグループ化できるようgroupに、のパラメーターも参照してください。deferred

別の方法は、一部の列のみをクエリすることですが、この場合tuple、モデルインスタンスの代わりにインスタンスを取得しているUserため(この場合)、フォームの入力には問題がない可能性がありますが、モデルの検証にはあまり適していません。session.query(Book.id, Book.title).all()

于 2012-07-09T12:59:36.910 に答える