python - 使用 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 作为数据库。
解决方案
似乎您使用不同的方式self.session
来获取Tag
和获取Book
您然后尝试附加Tag
到。为了能够将对象A附加到对象B,它们必须都存在于同一会话中。
很难说出您是如何创建会话的,因为您的帖子仅显示使用它的代码,但请确保您只有一个会话。
推荐阅读
- node.js - 在 nodejs 中拆分和重建文件会通过某些格式更改其长度
- android - Android camera2 图像方向问题
- asp.net - 如何让命令 dotnet 恢复?
- terraform - terraform中的不同模块可以使用相同的vars文件吗
- php - Codeigniter 无法从操作 url 中找到
- python - 具有多处理,酸洗错误的python队列
- oracle - 如何配置 dbms_metadata.get_ddl 在索引的每一列之后添加“ASC”?
- angular - ngIf 中的 Angular 2+ 取消绑定属性
- scala - 除非终止代码,否则在 Scala 代码中创建文件不可用
- python - 如何用 # 或 拒绝字符串?使用正则表达式 python