【问题标题】:sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'library_category_items' expected to delete 1 row(s); Only 2 were matchedsqlalchemy.orm.exc.StaleDataError:表'library_category_items'上的DELETE语句预计删除1行;只有2个匹配
【发布时间】: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


【解决方案1】:

您看到此错误的原因是您的 library_category_items 表中有重复条目,而 category.items.remove(book) 需要一个。您需要找出为什么将同一行两次输入数据库并阻止它。

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 2015-08-26
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2017-05-20
    相关资源
    最近更新 更多