car*_*arl 8 sql sqlalchemy flask-sqlalchemy
我有两张桌子。一种称为书籍,一种称为 library_categories。现在我想将书籍排序到 library_categories 中,条件是一本书可以属于多个图书馆类别。这是我的书
class Books(db.Model):
book_id = db.Column(db.String(1000), primary_key=True)
price = db.Column(db.String(1000))
def __repr__(self):
return '<Books %r>' % (self.arxiv_id)
Run Code Online (Sandbox Code Playgroud)
这是我的图书馆类别
class Library_category(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
name = db.Column(db.String(1000))
def __repr__(self):
return '<Library_category %r>' % (self.id)
Run Code Online (Sandbox Code Playgroud)
任何用户都可以在其中创建类别。现在我想链接图书馆类别和书籍,我通过一个表格来做到这一点
library_category_items = db.Table('library_category_items',
db.Column('books_book_id', db.String(1000), db.ForeignKey('books.book_id')),
db.Column('library_category_id', db.Integer, db.ForeignKey('library_category.id'))
)
Run Code Online (Sandbox Code Playgroud)
这一切似乎都很好,但是当我想从这个表中删除一本书时,我得到了两个类别
sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'library_category_items' expected to delete 1 row(s); Only 2 were matched.
Run Code Online (Sandbox Code Playgroud)
删除是这样完成的
users = models.User.query.all()
for user in users:
for category in user.library_categories.all():
for book in category.items:
category.items.remove(book)
db.session.delete(category)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)
我的用户模型具有属性 library_categories ,它给出了这个用户的所有类别,而 items 是一个类别的属性,它给出了该类别中的所有书籍。这些关系定义为
user = db.relationship("User", backref=db.backref('library_categories', lazy='dynamic'))
items = db.relationship('Books', secondary=library_category_items, backref=db.backref('library_categories', lazy='dynamic'))
Run Code Online (Sandbox Code Playgroud)
(这些是在 library_category 中定义的)
知道我做错了什么吗?谢谢卡尔
编辑:如果我阻止删除类别的项目,我都可以让它工作
viewonly=True,
Run Code Online (Sandbox Code Playgroud)
在
items = db.relationship('Books', viewonly=True, secondary=library_category_items, backref=db.backref('library_categories', lazy='dynamic'))
Run Code Online (Sandbox Code Playgroud)
但是,sql-alchemy 将重用表的 id,因此可能会创建一个新类别,其中包含来自旧(已删除)类别的条目......有人知道更好的解决方案吗?有没有办法防止 sqlalchemy 多次使用相同的 id?
小智 3
您看到此错误的原因是您的library_category_items 表中有重复的条目,并且category.items.remove(book)需要有一个条目。您需要找出为什么同一行在数据库中输入两次并阻止它。
| 归档时间: |
|
| 查看次数: |
2844 次 |
| 最近记录: |