У меня возникла проблема, при которой я получаю сообщение об ошибке, подобное этому:
"MyPyramidApplication Error"<class 'sqlalchemy.orm.exc.StaleDataError'>: DELETE statement on table 'page_view' expected to delete 6 row(s); Only 0 were matched.
Итак, у меня есть хорошая идея, что является причиной проблемы, но я не смог ее решить.
У меня есть модель page_view, которая имеет внешний ключ на page_id
и user_id
.
Вот как выглядит модель:
page_view_table = sa.Table(
'page_view',
metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('page_id', sa.Integer, sa.ForeignKey('guide.id')),
sa.Column('user_id', sa.Integer, sa.ForeignKey('user.id')),
sa.Column('last_view', sa.DateTime, nullable=False),
sa.UniqueConstraint('user_id', 'page_id'),
mysql_engine='InnoDB',
mysql_charset='utf8mb4'
)
Воткак выглядят отношения
orm.mapper(Page, page_table,
properties = {
'users_viewed': sa.orm.relation(
User,
secondary=page_view_table,
backref='page'),
}
)
Я добавляю некоторые элементы в свою базу данных с помощью оператора вставки, что-то похожее на это:
ins = model.page_view_table.insert()
sql = str(ins)
sql += ' ON DUPLICATE KEY UPDATE last_view = :last_view'
session = model.Session()
session.execute(sql, page_views)
mark_changed(session)
Насколько я могу судить из журналовтранзакции фиксируются правильно, и я вижу элементы в БД.
Однако, когда я пытаюсь удалить элемент страницы с помощью ORM, я получаю исключение StaleDataError.Просматривая журналы, я вижу, что ORM выдает оператор удаления, но затем откатывается из-за ошибки.
Я попытался поэкспериментировать с session.expire_all()
, а также session.expunge_all()
сразу после оператора вставки, но они не былиЭто не очень полезно, и я все еще вижу ошибку.
Вот что я вижу в журналах SQLAlchemy.
2011-11-05 18:06:08,031 INFO [sqlalchemy.engine.base.Engine][worker 3] DELETE FROM page_view WHERE page_view.page_id = %s AND page_view.user_id = %s
2011-11-05 18:06:08,031 INFO [sqlalchemy.engine.base.Engine][worker 3] (13818L, 259L)
2011-11-05 18:06:08,032 INFO [sqlalchemy.engine.base.Engine][worker 3] DELETE FROM page_view WHERE page_view.page_id = %s AND page_view.user_id = %s
2011-11-05 18:06:08,033 INFO [sqlalchemy.engine.base.Engine][worker 3] (13818L, 259L)
2011-11-05 18:06:08,033 INFO [sqlalchemy.engine.base.Engine][worker 3] ROLLBACK
Я думал, что оператор двойного удаления был подозрительным, возможно, указывает на неправильно настроенный ORMотношения, но я не думаю, что это так.