我遇到一个问题,出现如下错误:
"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
and a 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 关系,但我认为情况并非如此。