Python 从SQLAlchemy多对多删除匹配错误的行数

Python 从SQLAlchemy多对多删除匹配错误的行数,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我尝试使用SQLAlchemy删除烧瓶中的多对多对象。我有这些模型,它们类似于: 但当我运行commit时,此操作失败: db.session.commit() 2017-01-30 20:59:48,706 INFO sqlalchemy.engine.base.Engine DELETE FROM tags WHERE tags.tag_id = ? AND tags.document_id = ? 2017-01-30 20:59:48,706 INFO sqlalchemy.engine

我尝试使用SQLAlchemy删除烧瓶中的多对多对象。我有这些模型,它们类似于:

但当我运行
commit
时,此操作失败:

db.session.commit()
2017-01-30 20:59:48,706 INFO sqlalchemy.engine.base.Engine DELETE FROM tags WHERE tags.tag_id = ? AND tags.document_id = ?
2017-01-30 20:59:48,706 INFO sqlalchemy.engine.base.Engine (2, 2)
2017-01-30 20:59:48,707 INFO sqlalchemy.engine.base.Engine ROLLBACK
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/scoping.py", line 157, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 874, in commit
    self.transaction.commit()
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 461, in commit
    self._prepare_impl()
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 441, in _prepare_impl
    self.session.flush()
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2139, in flush
    self._flush(objects)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2259, in _flush
    transaction.rollback(_capture_exception=True)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise
    raise value
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2223, in _flush
    flush_context.execute()
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 389, in execute
    rec.execute(self)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 503, in execute
    self.dependency_processor.process_saves(uow, states)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/dependency.py", line 1092, in process_saves
    secondary_update, secondary_delete)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/dependency.py", line 1113, in _run_crud
    result.rowcount)
sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'tags' expected to delete 1 row(s); Only 5 were matched.
db.session.commit()
2017-01-30 20:59:48706信息sqlalchemy.engine.base.engine从tags.tag_id=?和tags.document_id=?
2017-01-30 20:59:48706信息sqlalchemy.engine.base.engine(2,2)
2017-01-30 20:59:48707信息sqlalchemy.engine.base.engine回滚
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python3.6/site packages/sqlalchemy/orm/scoping.py”,do中第157行
返回getattr(self.registry(),name)(*args,**kwargs)
文件“/usr/lib/python3.6/site packages/sqlalchemy/orm/session.py”,提交中的第874行
self.transaction.commit()
提交中的文件“/usr/lib/python3.6/site packages/sqlalchemy/orm/session.py”,第461行
self.\u prepare\u impl()
文件“/usr/lib/python3.6/site packages/sqlalchemy/orm/session.py”,第441行,在
self.session.flush()
文件“/usr/lib/python3.6/site packages/sqlalchemy/orm/session.py”,第2139行,刷新
自冲洗(对象)
文件“/usr/lib/python3.6/site packages/sqlalchemy/orm/session.py”,第2259行,在\u flush中
事务.rollback(\u capture\u exception=True)
文件“/usr/lib/python3.6/site packages/sqlalchemy/util/langhelpers.py”,第60行,在退出时__
兼容性(exc_类型、exc_值、exc_tb)
文件“/usr/lib/python3.6/site packages/sqlalchemy/util/compat.py”,第187行,在reraise中
增值
文件“/usr/lib/python3.6/site packages/sqlalchemy/orm/session.py”,第2223行,在\u flush中
flush_context.execute()
文件“/usr/lib/python3.6/site packages/sqlalchemy/orm/unitofwork.py”,执行中第389行
rec.execute(self)
文件“/usr/lib/python3.6/site packages/sqlalchemy/orm/unitofwork.py”,执行中的第503行
自相关性\u处理器。进程\u保存(uow,状态)
文件“/usr/lib/python3.6/site packages/sqlalchemy/orm/dependency.py”,第1092行,进程中保存
二次更新,二次删除)
文件“/usr/lib/python3.6/site-packages/sqlalchemy/orm/dependency.py”,第1113行,在crud中
结果(行计数)
sqlalchemy.orm.exc.StaleDataError:表“tags”上的DELETE语句应删除1行;只有5个匹配。

如前所述,我们似乎有许多关联post标记。解决

tags = db.Table('tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('document_id', db.Integer, db.ForeignKey('document.id')),
    db.PrimaryKeyConstraint('tag_id', 'document_id')
)

相关文件:@piotrdawiduk谢谢,这似乎是合理的复制品。
db.PrimaryKeyConstraint
db.UniqueConstraint
相同,与
db.PrimaryKeyConstraint('tag\u id','document\u id')
中的

db.session.commit()
2017-01-30 20:59:48,706 INFO sqlalchemy.engine.base.Engine DELETE FROM tags WHERE tags.tag_id = ? AND tags.document_id = ?
2017-01-30 20:59:48,706 INFO sqlalchemy.engine.base.Engine (2, 2)
2017-01-30 20:59:48,707 INFO sqlalchemy.engine.base.Engine ROLLBACK
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/scoping.py", line 157, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 874, in commit
    self.transaction.commit()
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 461, in commit
    self._prepare_impl()
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 441, in _prepare_impl
    self.session.flush()
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2139, in flush
    self._flush(objects)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2259, in _flush
    transaction.rollback(_capture_exception=True)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise
    raise value
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2223, in _flush
    flush_context.execute()
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 389, in execute
    rec.execute(self)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 503, in execute
    self.dependency_processor.process_saves(uow, states)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/dependency.py", line 1092, in process_saves
    secondary_update, secondary_delete)
  File "/usr/lib/python3.6/site-packages/sqlalchemy/orm/dependency.py", line 1113, in _run_crud
    result.rowcount)
sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'tags' expected to delete 1 row(s); Only 5 were matched.
tags = db.Table('tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('document_id', db.Integer, db.ForeignKey('document.id')),
    db.PrimaryKeyConstraint('tag_id', 'document_id')
)