2013-09-03 2 views
5

単純な戻り値の場合、すべての結果クエリは一方のメソッドが他方より優先されるべきですか?私は両方のオンラインの使用を見つけることができますが、実際には違いを説明するものは見つかりません。SQLAlchemy db.session.query()vs model.query

db.session.query([my model name]).all() 

[my model name].query.all() 

私の[モデル名] .query.all()はわかりやすいと感じます。

+6

http://stackoverflow.com/questions/12350807/whats-the-difference-between-model-query-and-session-querymodel-in-sqlalchemy – alecxe

+0

私は後者が好きですが、モデルから特定の列を選択します。その場合、db.session.query(Model.column_1、Model.column_2).all() –

+0

[SQLAlchemyのModel.queryとsession.query(Model)の違いは何ですか?](https://スタックオーバーフロー。com/questions/12350807/whats-the-model-query-and-session-querymodel-in-sqlalchemyの違い) – fgblomqvist

答えて

1

この質問に答える際には、高い優先度の主観があるので、明確な答えを出すのは難しいです。

2つ目のアプローチでは、追加のステップとしてモデルに組み込む必要があるため、db.sessionが必要です。デフォルトではBaseクラスの一部としてそこには存在しません。例えば:

Base = declarative_base() 
DBSession = scoped_session(sessionmaker()) 
class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    fullname = Column(String) 
    password = Column(String) 
session = Session() 
print(User.query) 

は、このコードは、次のエラーで失敗します。

AttributeError: type object 'User' has no attribute 'query'

あなたはこのような何か実行する必要があります。しかし

class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    fullname = Column(String) 
    password = Column(String) 
    query = DBSession.query_property() 

を、それもあると主張することができという理由だけでデフォルトでは有効になっていません。クエリを起動するための合理的な方法として無効にしません。さらに、flask-sqlalchemyパッケージ(これはsqlalchemyをフラスコのWebフレームワークに簡単に統合できます)は、Modelクラス(doc)の一部として既に実行されています。モデルへのクエリプロパティを追加することもSQLAlchemyのチュートリアル(doc)で見ることができます。

class User(object): 
    query = db_session.query_property() 
    .... 

このように、人々はどちらかのアプローチを主張することができます。

個人的には、1つのテーブルから選択するときに第2の方法を優先します。たとえば、次のようになります。

serv = Service.query.join(Supplier, SupplierUsr).filter(SupplierUsr.username == usr).all() 

これは、行の長さが短くて読みやすいためです。

複数のテーブルから選択する場合や列を指定する場合は、複数のモデルから情報を抽出する際にモデルクエリメソッドを使用します。

それはコードがより一貫なりますようカウンタ引数は常にsession.queryメソッドを使用して作ることができる、そして左から右に読むとき、読者はすぐにSQLAlchemyのディレクティブは、彼らが行っていることを知っている、と述べた
deliverables = db.session.query(Deliverable.column1, BatchInstance.column2).\ 
    join(BatchInstance, Service, Supplier, SupplierUser). \ 
    filter(SupplierUser.username == str(current_user)).\ 
    order_by(Deliverable.created_time.desc()).all() 

読んでいるのは、テーブルと列が何であるかを精神的に吸収する前に、クエリになります。

あなたの質問への回答は主観的であり、正解はなく、いずれかのコードの可読性のメリットは小さいです。大きな利点があるのは、多くのテーブルから選択してsession.queryメソッドを使用する場合にモデルクエリを使用しないことだけです。

関連する問題