首页 > 解决方案 > 使用 m2m 关系创建对象时出现 SQLAlchemy 会话错误

问题描述

我是 SQLAlchemy 和 Flask 的新手。我正在尝试使用 m2m 关系创建一个对象(book)并将一个现有对象(tag_2)附加到该关系:

book = Book(title='title')

tag_1 = Tag(name='tag')
book.tags.append(tag_1)     # New tag works well

tag_2 = Tag.query.get(123)  # Get existed tag by id
print(tag_2)                # >>> Tag #123
book.tags.append(tag_2)     # ERROR: Object '<Tag at ...>' is already attached to session '1'

self.session.add(book)
self.session.commit()

创建新的相关对象没有问题,但无法指向现有对象。

我的模型:

book_tags = db.Table('book_tags', db.metadata,
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('book_id', db.Integer, db.ForeignKey('book.id'))
)


class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True)


class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(300), nullable=False)
    tags = db.relationship('Tag', secondary=book_tags)

我使用 sqlite 作为数据库。

标签: pythonflaskormsqlalchemy

解决方案


似乎您使用不同的方式self.session来获取Tag和获取Book您然后尝试附加Tag到。为了能够将对象A附加到对象B,它们必须都存在于同一会话中。

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


推荐阅读