我有一个相对复杂的结构,我一直在尝试获得一个最小的工作示例,但我无法做到。
我的表结构大致如下:
class Table1(_db.Entity):
name = Required(str)
table2s = Set('Table2')
class Table2(_db.Entity):
height = Required(Decimal)
length = Required(Decimal)
table1 = Optional('Table1')
composite_key(height, length, table1)
with db_session:
Table2(height=2, length=1)
try:
Table2.exists(height=2, length=1) # This will throw an error
except AssertionError:
Table2.exists(height=2, length=1) # This works
在表 2 中,当我有等效的代码时composite_key(height, length)
,代码工作正常。但是,当我compmosite_key(height, length, table1)
执行存在语句时,它会返回一个AssertionError
.
我浏览了一些源代码,并在以下几行中找到了一些问题:
我在 0.7.6 版上,安装了pip install pony
1875 年:assert prev_vals != new_vals
在函数中db_update_composite_index
这是因为在第 4151 行:
obj = cache_index.get(pkval)
被错误地拉出(?)。
obj._dbvals_
没有为无的条目。
然后在第 4591 行,如果old_dbval = get_dbval(attr, NOT_LOADED)
old_dbval 默认为 NOT_LOADED,这会导致不删除属性。
这导致进入第if statement
4616 行的循环if any(attr in avdict for attr in attrs)
并在cache.db_update_composite_index(obj, attrs, prev_vals, new_vals)
因为prev_vals == new_vals