2017-02-02 11 views
0
私は仕事に関係にeagerloading取得しようとしている

が、古典的には、「ループ内でデータベース項目に呼び出す」の問題を働いていないeagerloadingではなくeagerloadするためにSQLAlchemyの

users = Session.query(User).all() # SELECT * from users 
for user in users: 
    foo(user.exams) # SELECT * from exams where user_id = ? 

すなわち、ここで私は何やって

まず、ここに私のモデルの定義は以下のとおりです。

Base = declarative_base() 

class Users(Base): 
    id = db.Column(db.Integer, primary_key=True) 

class Exams(Base): 
    id = db.Column(db.Integer, primary_key=True) 
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) 
    user = db.relationship(
     "Users", 
     backref=sqlalchemy.orm.backref(
      'exams', 
      cascade='all, delete-orphan' 
     ), 
     foreign_keys=[user_id] 
    ) 

しかし、その後、私は実際に生のSQL調べるとき:

q = Session().query(Users).join(Users.exams).options(joinedload(Users.exams)) 
print str(q) 

を私は(フォーマット済み)を取得:

(SELECT users.id 
    FROM users 
    JOIN exams ON users.id = exams.user_id) 

私が本当に期待していたとき:

(SELECT exams.id, exams.user_id, users.id 
FROM users 
JOIN exams ON users.id = exams.user_id) 

私はuser.examsとすることができますので、別のクエリをデータベースに送信する必要はありません。 eagerloading作業はどのように行うのですか?

答えて

1

それはちょうど次のようになります。それでも私は生のSQLを与えて

q = Session().query(Users).options(joinedload('exams')) 
+0

は "users.id = exams.user_id ON試験に参加 ユーザーからusers.id SELECT":/私はこのHTTPを以下午前:/ /docs.sqlalchemy.org/en/latest/orm/loading_relationships.html#the-zen-of-eager-loading – cozos

+0

結果を取得し、 '.all()' 'Session()。query(Users)を使用しますか? .options(joinedload( 'exams'))。すべて() ' – metmirr