首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较PonyORM中的实体实例

比较PonyORM中的实体实例
EN

Stack Overflow用户
提问于 2018-06-18 07:10:36
回答 1查看 240关注 0票数 1

我试图比较PonyORM实体实例的标识/平等。考虑使用estore示例数据库的下列代码:

代码语言:javascript
复制
from pony.orm import *
from pony.orm.examples.estore import *

# Test 1
with db_session:
    a = Customer[1]
    b = Customer[1]
print(a is b, a == b)    # True True

# Test 2
with db_session:
    a = Customer[1]
with db_session:
    b = Customer[1]
print(a is b, a == b)    # False False

具有相同和相等主键测试的实体当且仅当在同一个db_session中检索时。

  1. 这种行为背后的理由是什么?(从docs:如果具有指定主键的对象已经加载到db_session()缓存中,则Pony将从缓存中返回对象,而无需向数据库发送查询。这解释了身份测试的结果。我仍然希望在测试1和测试2中看到相等。)
  2. 推荐的测试相等性的方法是什么(除了比较主键之外)?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-22 11:29:58

这种行为背后的理由是什么?

最初,Pony希望您只使用db_session中的对象。因此,一旦db_session结束,您就不应该使用这些对象。为什么-您可以将db_session视为事务处理。因此,如果使用两个不同的db_sessions,则使用不同的事务,这意味着不能保证这两个对象在逻辑上是一致的。

为什么小马允许你在db_session之后使用对象?因为有些开发人员希望将应用层与数据库层分开,并在db_session结束后呈现HTML模板。

实际上,小马认为正确的方法是在db_session中渲染模板,但这是太需要的,所以小马变成了允许的。但是无论如何,混合来自另外两个db_sessions的对象是完全错误的,小马不希望你这样做。

测试是否平等的推荐方法是什么?

如果您还想比较来自不同db_sessions的对象,我建议您使用这样的函数

代码语言:javascript
复制
def equals(a, b):
    if isinstance(a, pony.orm.core.Entity):
        return type(a) == type(b) and a.get_pk() == b.get_pk()
    return a == b

with db_session:
    a = Customer[1]
with db_session:
    b = Customer[1]
print(a is b, a == b, equals(a, b))    # False, False, True
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50904265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档