參考:

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()

SQLAlchemy使用笔记--SQLAlchemy ORM(三)的更多相关文章

  1. SQLAlchemy 学习笔记(三):ORM 中的关系构建

    个人笔记,不保证正确. 关系构建:ForeignKey 与 relationship 关系构建的重点,在于搞清楚这两个函数的用法.ForeignKey 的用法已经在 SQL表达式语言 - 表定义中的约 ...

  2. SQLAlchemy 学习笔记(二):ORM

    照例先看层次图 一.声明映射关系 使用 ORM 时,我们首先需要定义要操作的表(通过 Table),然后再定义该表对应的 Python class,并声明两者之间的映射关系(通过 Mapper). 方 ...

  3. SQLAlchemy使用笔记--SQLAlchemy ORM(二)

    參考: http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#building-a-relationship http://docs.sqla ...

  4. SQLAlchemy 学习笔记(一):Engine 与 SQL 表达式语言

    个人笔记,如有错误烦请指正. SQLAlchemy 是一个用 Python 实现的 ORM (Object Relational Mapping)框架,它由多个组件构成,这些组件可以单独使用,也能独立 ...

  5. SQLAlchemy 简单笔记

    ORM 江湖##### 曾几何时,程序员因为惧怕SQL而在开发的时候小心翼翼的写着sql,心中总是少不了恐慌,万一不小心sql语句出错,搞坏了数据库怎么办?又或者为了获取一些数据,什么内外左右连接,函 ...

  6. Sqlalchemy python经典第三方orm

    Ⅰ. 安装 pip install sqlalchemy Ⅱ. 起步链接 import time import threading import sqlalchemy from sqlalchemy ...

  7. Django和SQLAlchemy,哪个Python ORM更好?

    ORM是什么? 在介绍Python下的两个ORM框架(Django和SQLAlchemy)的区别之前,我们首先要充分了解ORM框架的用途. ORM代表对象关系映射.ORM中的每个单词解释了他们在实际项 ...

  8. Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式

    sqlalchemy的声明层ORM访问方式 sqlalchemy中可以利用声明层进行表格类的建立,并利用ORM对象进行数据库的操作及访问,另一种方式为显式的 ORM 访问方式. 主要的建立步骤包括: ...

  9. Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式

    sqlalchemy 的显式 ORM 访问方式 对于sqlalchemy,可以利用一种显式的ORM方式进行访问,这种方式无需依赖声明层,而是显式地进行操作.还有一种访问方式为声明层 ORM 访问方式. ...

随机推荐

  1. 程序员编写API遵循法则

    Api理解: 1.遵循函数.数据库字段命名规则 2.思考项目的远景(扩展性) 3.思考团队调用是否方便及舒服 4.思考是否有灵动性

  2. 洛谷[P3622] 动物园

    状压DP 发现本题中,每个小朋友是否高兴仅取决于其后五个动物的情况,我们可以用状压DP解决本题 首先已处理 num[i][s] 表示对于位置 i ,状态为 s 时有多少在 s 的同学满意 转移方程很好 ...

  3. BZOJ 3509: [CodeChef] COUNTARI

    3509: [CodeChef] COUNTARI Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 883  Solved: 250[Submit][S ...

  4. [TYVJ1930]编年史

    现在 applepi 手上有一本十分古老的编年史,这本史书记录了很多著名的历史事件.于是applepi 有了一个奇怪的想法……他想知道那些有名的历史事件都是在星期几发生的.现在轮到你了,你要帮助app ...

  5. ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: YES)

    ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) ERROR 1045 (28000 ...

  6. win10易升卸载

  7. 【Visual Studio】“rc.exe”已退出,代码为 5 ("rc.exe" exited with code 5.)

    [解决方案]找到 rc.exe 所在目录,然后 方法1:添加该目录到 VC++ Directories --> Executable Directories中 方法2:添加到系统变量中的Path ...

  8. NGINX配置获取CloudFlare 下的访客真实IP并记录到日志

    我用的是lnmp.org的环境 /usr/local/nginx/conf/nginx.conf 在 http { } 部分增加 map $HTTP_CF_CONNECTING_IP $clientR ...

  9. html5---音频视频基础一

    //html5 音频和视频 :标签 a: audio,video b: source :视频容器 a:容器文件,类似于压缩了一组文件 -音频轨道 -视频轨道 -元数据:封面,标题,字幕等 -格式:.a ...

  10. JS-JavaScript String 对象-string对象方法1:fromCharCode()、charCodeAt()

    1.fromCharCode(): 可接受一个指定的 Unicode 值,然后返回一个字符串. 1). 语法:String.fromCharCode(n1, n2, ..., nX)  (n1, n2 ...