我试图比较PonyORM实体实例的标识/平等。考虑使用estore示例数据库的下列代码:
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中检索时。
发布于 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的对象,我建议您使用这样的函数
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, Truehttps://stackoverflow.com/questions/50904265
复制相似问题