まず、__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)
と、コードからアクセスされるまで列photo
とexcerpt
列が読み込まれません。その時点で、データベースに対する別のクエリが実行され、不足しているデータが読み込まれます。
ただし、クエリを実行する前に、すぐにBook
列が必要であることがわかっている場合photo
でも、undeferオプションを使用して遅延動作をオーバーライドできますquery = session.query(Book).options(undefer('photo')).get(1)
。
基本的に、ここでの提案は、すべての列(あなたの場合:ユーザー名、パスワードなどを除く)を延期undefer
し、各ユースケース(ビュー)で、その特定のビューに必要であることがわかっている列でオーバーライドすることです。ユースケース(ビュー)ごとに属性をグループ化できるようgroup
に、のパラメーターも参照してください。deferred
別の方法は、一部の列のみをクエリすることですが、この場合tuple
、モデルインスタンスの代わりにインスタンスを取得しているUser
ため(この場合)、フォームの入力には問題がない可能性がありますが、モデルの検証にはあまり適していません。session.query(Book.id, Book.title).all()