【发布时间】:2015-12-21 04:37:51
【问题描述】:
我有两张桌子。一种称为书籍,一种称为 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)
这是我的图书馆类别
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)
任何用户都可以创建类别。现在我想将图书馆类别和书籍链接起来,我通过一个表格来做到这一点
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'))
)
这一切似乎都很好,但是当我想从这个表中删除一本书时,我得到了两个类别的书
sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'library_category_items' expected to delete 1 row(s); Only 2 were matched.
删除完成为
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()
我的 User 模型有一个属性 library_categories ,它给出了这个用户的所有类别,而 items 是一个 category 的属性,它给出了该类别中的所有书籍。这些关系定义为
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'))
(这些在 library_category 中定义)
知道我做错了什么吗? 谢谢 卡尔
编辑: 如果我阻止使用
删除类别的项目,我都可以让它工作viewonly=True,
在
items = db.relationship('Books', viewonly=True, secondary=library_category_items, backref=db.backref('library_categories', lazy='dynamic'))
但是,sql-alchemy 将重用表的 id,因此可能会创建一个新类别,其中包含来自旧(已删除)类别的条目......有人知道更好的解决方案吗?有没有办法防止sqlalchemy多次使用同一个id?
【问题讨论】:
-
@carl 你有没有弄清楚问题出在哪里?我遇到了类似的问题并且被卡住了:(
标签: sql sqlalchemy flask-sqlalchemy