У меня относительно сложная структура, и я пытался получить минимальный рабочий пример, который ломается, но я не смог.
Вот примерно такая структура моей таблицы:
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
ln 1875: assert prev_vals != new_vals
в функции db_update_composite_index
Это начинается потому, что в строке 4151:
obj = cache_index.get(pkval)
тянет неправильно (?).
obj._dbvals_
не имеет записи, которая является None.
Затем в строке 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