- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们使用 sqlalchemy 的异步版本,我们需要预先加载每个关系(延迟加载不适用于异步)。因此,对于我们模型中的每个关系,我们都设置了 lazy='raise'
。问题是它似乎在引发错误方面过于激进。考虑以下单元测试:
async def test_user_group_self_allowed(self):
privilege = await self.db.get(Privilege, 1, [joinedload(Privilege.role)])
options = [joinedload(Item.privileges).joinedload(Privilege.role), joinedload(Item.item_group)]
item = await self.db.get(Item, 1, options)
item.privileges.append(privilege)
await (self.db.commit())
options = [joinedload(User.user_groups).joinedload(UserGroup.privileges), joinedload(User.privileges)]
user = await self.db.get(User, 1, options)
user.privileges = []
item = await self.db.get(Item, 1, [joinedload(Item.privileges).joinedload(Privilege.role), joinedload(Item.item_group)])
user_group = await self.db.get(UserGroup, 1, [joinedload(UserGroup.organization)])
print('why?????', user_group.organization)
self.assertTrue(await self.helper.is_authorized(self.db, user, 'edit', user_group))
注意打印,它会导致以下错误:
Traceback (most recent call last):
File "/usr/lib/python3.9/unittest/async_case.py", line 65, in _callTestMethod
self._callMaybeAsync(method)
File "/usr/lib/python3.9/unittest/async_case.py", line 88, in _callMaybeAsync
return self._asyncioTestLoop.run_until_complete(fut)
File "/usr/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
return future.result()
File "/usr/lib/python3.9/unittest/async_case.py", line 102, in _asyncioLoopRunner
ret = await awaitable
File "/src/backend-core/backend_core/tests/authorization.py", line 206, in test_user_group_self_allowed
print('why?????', user_group.organization)
File "/usr/local/lib/python3.9/dist-packages/sqlalchemy/orm/attributes.py", line 481, in __get__
return self.impl.get(state, dict_)
File "/usr/local/lib/python3.9/dist-packages/sqlalchemy/orm/attributes.py", line 926, in get
value = self._fire_loader_callables(state, key, passive)
File "/usr/local/lib/python3.9/dist-packages/sqlalchemy/orm/attributes.py", line 962, in _fire_loader_callables
return self.callable_(state, passive)
File "/usr/local/lib/python3.9/dist-packages/sqlalchemy/orm/strategies.py", line 836, in _load_for_state
self._invoke_raise_load(state, passive, "raise")
File "/usr/local/lib/python3.9/dist-packages/sqlalchemy/orm/strategies.py", line 795, in _invoke_raise_load
raise sa_exc.InvalidRequestError(
sqlalchemy.exc.InvalidRequestError: 'UserGroup.organization' is not available due to lazy='raise'
如您所见,它提示组织没有被急切加载,而我明确地将其包含在带有 joinedload
的选项中。现在我们可以通过将用户查询的选项更改为:
options = [joinedload(User.user_groups).joinedload(UserGroup.privileges), joinedload(User.privileges), joinedload(User.user_groups).joinedload(UserGroup.organization)]
(与之前相同的选项,只是我们为用户添加了一个joinedload -> UserGroups -> Organization)
这会使错误消失,一切都恢复正常。现在我的问题是,为什么它一开始就提示这个?我访问 user_group.organization
而不是 user.user_groups[x].organization
.. 我不知道这些查询到底是如何工作的,但我不仅有以这种方式编写过多的联合负载,我认为这也会导致不必要的查询。
最佳答案
事实证明,.get
缓存的内容超出了我的预期。不仅是主要实体(在本例中为 usergroup
),还有通过 joinedload
(user.user_group.organization
)加载的内容。因此,这意味着直接获取组织不会覆盖来自 user.user_group.organization
或 usergroup.organization
的缓存。但是可以这样做db.get(Organization, 1, populate_existing=True)
将再次检索实体并更新缓存。
来自docs :
如果给定的主键标识符存在于本地身份映射中,则直接从此集合返回对象并且不会发出 SQL,除非对象已标记为完全过期....
...
populate_existing – 使方法无条件地发出 SQL 查询并使用新加载的数据刷新对象,无论对象是否已经存在。
正如它所说,另一种方法是使对象过期,阅读更多相关信息 here
关于python - SQLAlchemy:懒惰 ='raise' 提示字段,即使它们已加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69448674/
嘿伙计们,我正在尝试删除最后一个 _1.jpg 如果它存在于我的表达中,但我遇到了一些麻烦 场景如下。 image_name_1.jpg(应该是image_name.jpg) image_name_1
对lazy="extra"究竟能做什么,有没有很好的解释? 我看过的所有帖子都只是重复了一个事实,即它会引用 MyObject.ItsCollection.Count进入 select count(*
我只在需要时加载 Google map 。在我重构代码之前,它的工作原理如下: function initialize_map_brand() { (...) } jQuery(document)
我编写了一个生成子集子集的函数。当我按以下方式使用子集[1..]时,它导致堆栈溢出。对于“正常”(非惰性)语言来说,这是“正常”行为。现在,我想改进我的懒惰功能。 附注我不理解懒惰(我试图理解它)所以
我正在尝试伪造对带有 out 参数的方法的调用,其中包含带有一些基本逻辑的 ReturnsLazily。理想情况下,我可以根据 ReturnsLazily 通过 AssignsOutAndRefPar
以下量词在场景、速度等方面有何不同。 ?、?? 和 ?+ 都匹配 0 或 1 次。 *, *?和*+` 都匹配0 次或更多次。 +、+? 和 ++ 都匹配1 次或多次。 ?、* 和 + 是贪心。 ??
我有以下代码: @Entity public class Foo { @OneToMany(mappedBy = "Foo", fetch = FetchType.LAZY) @Cascade
你如何使用正则表达式在 Stata 中实现非贪婪匹配?或者Stata甚至有这种能力? 我想提取出现在主题标签“#”和句点“.”之间的所有文本。 示例代码: clear set obs 3 genera
我有以下 Haskell 程序用于计算整数字符串的最大和子串: {-# LANGUAGE BangPatterns #-} {-# OPTIONS_GHC -O2 #-} import Data.Fu
我想记住如何在懒球拍中进行动态编程。解决了Euler项目的问题之一后,我开始感到奇怪: 从下面的三角形的顶部开始并移至相邻的三角形 在下面的行中,数字从上到下的最大值为23。 3 7 4
我是 Hibernate 对象持久化方面的新手。我正在读一本书,试图了解惰性设置为 false、急切和立即获取之间的区别,但我没有看到任何区别。有什么帮助吗?? 提前致谢! 最佳答案 立即获取和急切获
我正在使用Hibernate做映射。我的一个类有一组long。我想在获取此对象时将 lazy 设置为 true。如果我获取一个对象并在一段时间后使用其中的集合,会导致问题吗? 最佳答案 lazy 属性
所以我知道按需求调用只是按名称调用的内存版本。在 Martin Odersky 在 Coursera 上的 FP 类(class)的第 7.3 课(惰性评估)中,他提到如果使用按名称调用来实现 Str
语境 以下代码无限循环: (defn ex13 [] (take 5 (run* [x] (listo (lcons `a (lcons `b (lcons `c x
我刚开始学习 Haskell。下面是一些用命令式编写的代码,它实现了一个简单的服务器——它打印出 HTTP 请求 header 。除了我需要在 Haskell 中重新考虑它以使用惰性列表和高阶函数这一
据我了解,Racket 有严格的即急切的评估,但可以选择惰性评估。我对函数式语言所做的有限阅读表明,惰性求值语言通常可以更具表现力,因此为所有 Racket 程序选择惰性求值选项是否存在任何“技术”缺
这个问题在这里已经有了答案: Reference - What does this regex mean? (1 个回答) 关闭 1 年前。 最近,在网络*的某个地方,我找到了正则表达式的引用,它描
有谁知道关于以下主题的“现有技术”: 我有需要一些时间才能加载的数据。它们是各种股票的历史水平。 我想以某种方式预加载它们,以避免使用我的应用程序时出现延迟 但是,在开始时将它们分块预加载会使我的应用
我想知道的是:如果有一个基类,那么在 C++ 中每个*其他类继承自是不是一个好主意。基本上,它与 C# 的 Object 具有相同的接口(interface),即: *直接接口(interface)和
我正在尝试实现自己的 boolean 类,但无法为 && 复制 native 语义。以下人为设计的代码演示了该问题: #include > class MyBool { pub
我是一名优秀的程序员,十分优秀!