Python Sqlalchemy事件'append'侦听器导致唯一约束失败

Python Sqlalchemy事件'append'侦听器导致唯一约束失败,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,监听器在执行paper.reviewers.append(usr)之前被触发。append的执行在paper_reviewer表中插入了两个。第二个原因是整数错误:唯一约束失败 我在侦听器中尝试了不同的操作。如果操作触发了任何查询,则在执行commit()时会导致IntegrityError。我引用了google group成员的一个解决方案 “您的侦听器中可能发生自动刷新,因此请使用” 会话。无自动刷新“: " 您必须提供[mvce]#其他表上的db操作不足以说明问题。@univerio I已

监听器在执行
paper.reviewers.append(usr)
之前被触发。append的执行在paper_reviewer表中插入了两个。第二个原因是
整数错误:唯一约束失败


我在侦听器中尝试了不同的操作。如果操作触发了任何查询,则在执行commit()时会导致IntegrityError。

我引用了google group成员的一个解决方案 “您的侦听器中可能发生自动刷新,因此请使用” 会话。无自动刷新“: "


您必须提供[mvce]
#其他表上的db操作
不足以说明问题。@univerio I已在说明中提到:如果该操作触发任何查询,则在执行commit()时会导致IntegrityError。调用哪个表并不重要。我知道您已经描述了您正在做的事情。我要的是一个具体的例子,我可以运行。如果是任何查询,请输入您想要的任何查询。想想我需要采取什么步骤来重现你的问题;我需要添加缺少的
用户
模型,然后解释其他表上的
db操作
,最后,如果一切正常,再猜猜我是否正确解释了其他表上的
db操作
。提供完整的示例将消除其他变量。很抱歉,我之前弄乱了链接:@univerio Thx以获取回复。我没想到你会尝试运行代码。谷歌集团也发布了类似的问题。解决方案是“您的侦听器中可能发生了自动刷新,所以请将其用于会话。无自动刷新”:“一个通用的“禁用自动刷新”似乎是错误的建议。了解autoflush实际上是什么以及它发生的原因(如果会话进行了修改,查询可能会观察到过时的状态),这将有助于了解与实际执行的操作相关的更多内容,这里仍然没有显示。
 class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)

class Paper(db.Model):
    __tablename__ = 'papers'
    id = db.Column(db.Integer, primary_key=True)
    reviewers = db.relationship('User', secondary=paper_reviewer,
                                backref=db.backref('papers_reviewed',
                                                   lazy='dynamic'),
                                lazy='dynamic')

paper_reviewer = db.Table('paper_reviewer',
                          db.Column('user_id', db.Integer,
                                    db.ForeignKey('users.id'),
                                    primary_key=True),
                          db.Column('paper_id', db.Integer,
                                    db.ForeignKey('papers.id'),
                                    primary_key=True)
                          )

@event.listens_for(Paper.reviewers, 'append')
def paper_reviewers_append(target, value, initiator):
    # db operation on other tables
    # target is paper obj
    print target.reviewers.all() # or other operation


paper.reviewers.append(usr)
db.session.add(paper)
db.session.commit()
@event.listens_for(Paper.reviewers, 'append')
def paper_reviewers_append(target, value, initiator):
"""Update review preference."""
with db.session.no_autoflush:
    # db operation on other tables
    pass