SQLAlchemy使用筆記--SQLAlchemy ORM(三)

參考:
http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#eager-loading

預先加載

前面的代碼,因爲是lazy load,當我們調用User.addresses 時,sqlalchemy纔會發出sql語句去取addresses,
比如:

query = session.query(User).all()
for user in query:
    print(user.addresses)

如果有10個用戶,for循環10次,就會發10個取user中address信息的sql請求,這樣很沒有效率。
可以使用預先加載,在一個sql請求中吧User.addresses 都取出來。

subquery 加載

看例子:

users = session.query(User).options(subqueryload(User.addresses)).all()

發出的sql

SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users;

SELECT addresses.id AS addresses_id, addresses.email_address AS addresses_email_address, addresses.user_id AS addresses_user_id, anon_1.users_id AS anon_1_users_id
FROM (SELECT users.id AS users_id
FROM users) AS anon_1 JOIN addresses ON anon_1.users_id = addresses.user_id ORDER BY anon_1.users_id, addresses.id;

當取出users時,會發出2個sql,第一個sql是取出所有user的基本信息,第二個sql時取出所有user的address信息。

joinedload 加載

joinedload 加載會使用 LEFT OUTER JOIN 來加載信息

users = session.query(User).options(joinedload(User.addresses)).all()
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password, addresses_1.id AS addresses_1_id, addresses_1.email_address AS addresses_1_email_address, addresses_1.user_id AS addresses_1_user_id
FROM users LEFT OUTER JOIN addresses AS addresses_1 ON users.id = addr;


明確的使用join

當已經明確大join了User.addresses 後,可以使用contains_eager來加載address的信息。

users = session.query(User).join(User.addresses).options(contains_eager(User.addresses)).all()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章