Iva*_*hko 4 python orm sqlalchemy identity-map
是否可以使用不是来自主键的几个字段来从身份映射中检索项目(之前已获取)?例如,我经常按对查询表(external_id, platform_id),这是唯一键,但不是主键。在这种情况下我想省略不必要的 SQL 查询。
身份映射在 SQLAlchemy 对象的生命周期中保留session,即在 Web 服务或 RESTful API 的情况下,session对象的生命周期不超过一个request(推荐)。
来自: http: //martinfowler.com/eaaCatalog/identityMap.html
\n\n\n\n\n身份映射保存在单个业务事务中从数据库读取的所有对象的记录。每当您想要一个对象时,您首先检查身份映射以查看您是否已经拥有它。
\n
在 SQLAlchemy 的 ORM 中,有一个特殊的查询方法get(),它首先使用identity_mappk(仅允许的参数)并从恒等映射中返回对象,实际执行查询SQL并访问数据库。
来自文档:
\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\n\nget(ident)\n根据给定的主键标识符返回一个实例,如果
\n\nNone未找到则返回 \n。\n
get()的特殊之处在于它提供了对拥有者的身份映射的直接访问Session。如果给定的主键标识符存在于本地标识映射中,则直接从此集合返回该对象,并且不会发出 SQL,除非该对象已被标记为完全过期。如果不存在,则执行 SELECT 来定位该对象。
get()使用identity_map-官方文档:\n\n\n它\xe2\x80\x99 在某种程度上用作缓存,因为它实现了
\nidentity map\n 模式,并存储以其primary key. 但是,它\n 不\xe2\x80\x99 执行任何类型的查询缓存。这意味着,如果您说 \nsession.query(Foo).filter_by(name=\'bar\'),即使Foo(name=\'bar\')\n 就在那里,在身份映射中,会话也不知道 \n 。它必须向数据库发出 SQL,取回行,然后当它看到该行中的主键时,它可以在本地标识映射中查找并查看该对象是否已经存在。仅当您说query.get({some primary key})会话\n不\xe2\x80\x99s\n必须发出查询时\xe2\x80\x99s\ n 。
PS如果您不使用 进行查询,那么您一开始pk就没有点击。identity_map
很少有相关的问题,有助于澄清概念:
\n\n在身份映射之外强制执行 sqlalchemy ORM get()
\n小智 5
可以顺序访问整个身份映射:
for obj in session.identity_map.values():
print(obj)
Run Code Online (Sandbox Code Playgroud)
要通过任意属性获取对象,您必须首先过滤对象类型,然后检查属性。
它不是恒定时间的查找,但可以防止不必要的查询。
有一种说法认为,对象可能已被另一个进程修改,并且身份映射不保存当前状态,但此说法无效:如果您的事务隔离级别为read committed(或更低) - 通常是这种情况,数据总是可能在查询完成后立即更改。
| 归档时间: |
|
| 查看次数: |
7165 次 |
| 最近记录: |