SQLAlchemy ORMには、タスクを簡素化するいくつかの機能があります。ORM レイヤーに既に存在するかなりの車輪を再発明する必要があるようです:ユーザークラスと一緒に」 - これが ORM の機能です。
ORM では、他のものとは別に、ORM オブジェクトのキャッシュとして機能するセッションがあるため、トランザクションごとに同じモデルを複数回ロードすることを避けることができます。とにかく、リクエストを認証するために User オブジェクトをロードする必要があることがわかるでしょう。そのため、テーブルをまったくクエリしないことはおそらく選択肢ではありません。
一部の属性を遅延ロードするように構成することもできます。これにより、ほとんど必要のない、またはかさばるプロパティは、それらにアクセスしたときにのみロードされます。
リレーションシップを 1 つのクエリで積極的に読み込むように構成することもできます。これにより、何百もの小さな個別のクエリを実行する必要がなくなります。つまり、現在の設計では、以下のコードが開始するクエリの数は次のとおりです。
for user in get_all_users():
print user.get_avatar_uri()
print user.get_name()
print user.get_about()
あなたの説明から、1 + (num_users*3) クエリが必要なようです。SQLAlchemy ORM を使用すると、単一のクエリですべてをロードできます。
結論としては、主キーによってデータベースから単一のオブジェクトを取得することは、かなり安価な操作であり、facebook のサイズのものを構築していない限り、心配する必要はありません。心配する必要があるのは、1 つの大きなクエリで十分な数百の小さな個別のクエリを作成することです。これは、SQLAlchemy ORM が非常に優れている領域です。
さて、「ユーザーオブジェクトを作成し、取得したデータを使用していないときにユーザー行を検索するのは無駄ではありませんが、単に列のサブセットに変更を加えたいだけです」-私は理解していますあなたは次のようなことを考えています
class ChangePasswordForm(...):
def _change_password(self, user_id, new_password):
session.execute("UPDATE users ...", user_id, new_password)
def save(self, request):
self._change_password(request['user_id'], request['password'])
対
class ChangePasswordForm(...):
def save(self, request):
user = getuser(request['user_id'])
user.change_password(request['password'])
前者の例ではクエリを 1 つだけ発行し、後者では SELECT を発行してユーザー オブジェクトを作成し、次に UPDATE を発行する必要があります。後者は「2 倍効率的」に見えるかもしれませんが、実際のアプリケーションではその違いは無視できるほどのものです。さらに、多くの場合、検証 (新しいパスワードは古いパスワードと同じにすることはできません)、権限チェック (ユーザー Molly は写真 #12343 の説明を編集することを許可されていますか?) を行うために、とにかくデータベースからオブジェクトをフェッチする必要があります。ロギング。
余分なクエリを実行することの違いが重要になると思われる場合 (何百万人ものユーザーが常にプロフィール写真を編集している場合)、プロファイリングを行ってボトルネックがどこにあるかを確認する必要があります。