Python 创建具有m2m关系的对象时发生SQLAlchemy会话错误

Python 创建具有m2m关系的对象时发生SQLAlchemy会话错误,python,flask,orm,sqlalchemy,Python,Flask,Orm,Sqlalchemy,我不熟悉炼金术和烧瓶。我正在尝试创建一个具有m2m关系的对象书,并将现有对象标记_2附加到该关系中: book=Booktitle='title' tag_1=标记名='tag' book.tags.appendtag_1新标签效果良好 tag_2=tag.query.get123按id获取已存在的标记 打印标签2>>>标签123 book.tags.appendtag_2错误:对象已附加到会话“1” self.session.addbook self.session.commit 创建新的相关

我不熟悉炼金术和烧瓶。我正在尝试创建一个具有m2m关系的对象书,并将现有对象标记_2附加到该关系中:

book=Booktitle='title' tag_1=标记名='tag' book.tags.appendtag_1新标签效果良好 tag_2=tag.query.get123按id获取已存在的标记 打印标签2>>>标签123 book.tags.appendtag_2错误:对象已附加到会话“1” self.session.addbook self.session.commit 创建新的相关对象没有问题,但无法指向现有对象

我的模型:

book\u tags=db.表'book\u tags',db.metadata, db.Column'tag_id',db.Integer,db.ForeignKey'tag.id', db.Column'book_id',db.Integer,db.ForeignKey'book.id' 类Tagdb.Model: id=db.Columndb.Integer,主键=True name=db.Columndb.String50,unique=True 类Bookdb.Model: id=db.Columndb.Integer,主键=True title=db.Columndb.String300,null=False tags=db.关系“Tag”,secondary=book\u标签 我使用sqlite作为数据库。

tags=DB.relationship “标签”, 次要=书本标签, backref=db.backref'book',lazy='dynamic' 您需要在m2m关系中添加backref,因为
使用backref只会在另一端自动创建关系属性。backref='book'在某种程度上类似于在Tag类+back填充中显式地使用book=db.relationship'book'。使用backref对象,您可以将参数传递给该关系。

似乎您使用不同的self.session来获取标记,然后获取要将标记附加到的书籍。为了能够将对象A附加到对象B,它们必须同时存在于同一会话中


很难说您是如何创建会话的,因为您的帖子只显示使用它的代码,但请确保您只有一个会话。

您是在单个数据库会话中完成所有这些操作的吗?当您使用一个会话选择标记,然后尝试使用其他会话存储它时,通常会发生此错误。可怜的人调试这个的方法是打印会话。我使用flask_resty作为REST框架。我相信在这种情况下,它只创建一个会话。我将尝试创建一个用于选择标记的新标记。您只需要一个,相同。从你对下面答案的评论来看,你已经有两个环节了。确保每个请求只创建一个会话。如果你发布你的控制器的外观会有所帮助。是的,你是对的。非常感谢。相同错误,但使用Book而不是Tag:sqlalchemy.exc.InvalidRequestError:对象已附加到会话“1”这是“2”这是问题的根本原因已附加到会话“1”这是“2”,您需要在单个会话中执行这两个操作。