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作業はどのように行うのですか?
は "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
結果を取得し、 '.all()' 'Session()。query(Users)を使用しますか? .options(joinedload( 'exams'))。すべて() ' – metmirr