【问题标题】:sqlalchemy delete function problem, I want to delete a single item, but it actually deletes the whole category?sqlalchemy删除功能问题,我想删除单个项目,但它实际上删除了整个类别?
【发布时间】:2019-02-14 07:26:58
【问题描述】:

this is my github link

我在这个项目中使用 sqlalchemy。

除删除功能外,CRUD 的所有功能都运行良好。

只是想知道会发生什么?

# Edit the specific item
@app.route('/catalog/<int:categories_id>/<int:items_id>/edit',
           methods=['GET', 'POST'])
@login_required
def editItem(categories_id, items_id):
    editedItem = session.query(CategoryItem).filter_by(id=items_id).one()
...
    if request.method == 'POST':
...
        session.add(editedItem)
        session.commit()
        flash("item edited successfully!")
        return redirect(url_for('showItem', categories_id=categories_id,
                                items_id=items_id))
    else:
        return render_template('edititem.html', categories_id=categories_id,
                               items_id=items_id, item=editedItem)


# Delete the specific item
@app.route('/catalog/<int:categories_id>/<int:items_id>/delete',
           methods=['GET', 'POST'])
@login_required
def deleteItem(categories_id, items_id):
    itemToDelete = session.query(CategoryItem).filter_by(id=items_id).one()
...
    if request.method == 'POST':
        session.delete(itemToDelete)
        session.commit()
        flash("item deleted successfully!")
        return redirect(url_for('showCategories', categories_id=categories_id))
    else:
        return render_template('deleteitem.html', categories_id=categories_id,
                               items_id=items_id, item=itemToDelete)

正如您在代码中看到的那样。

editedItem 和 deleteItem 都在使用 session.query(CategoryItem).filter_by(id=items_id).one()

但是当我删除该项目时。

不是删除单个项目,而是删除整个类别。

请看下面的模板

<form action="{{url_for('deleteItem' ,categories_id=categories_id, items_id=items_id, item=itemToDelete)}}" method="POST">&nbsp
  <input type="submit" value ="Delete">
  <a href = "{{url_for('showItem',categories_id=categories_id, items_id=items_id)}}"><button type="button">Cancel</button></a>

我不确定是什么导致了这个问题。

【问题讨论】:

  • 给我们一个最小的工作示例,而不是一个广告 GitHub 链接。

标签: python sql sqlite flask sqlalchemy


【解决方案1】:

这是因为你设置了与级联delete-orphan的关系。

class Categories(Base):
    __tablename__ = 'categories'
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)
    user_id = Column(Integer, ForeignKey('user.id'))
    user = relationship(User)

    @property
    def serialize(self):
        return {
            'name': self.name,
            'id': self.id,
        }


class CategoryItem(Base):
    __tablename__ = 'category_item'
    name = Column(String(80), nullable=False)
    id = Column(Integer, primary_key=True)
    description = Column(String(250))
    categories_id = Column(Integer, ForeignKey('categories.id'))
    categories = relationship(Categories, cascade="all, delete-orphan",
                              single_parent=True)
    user_id = Column(Integer, ForeignKey('user.id'))
    user = relationship(User)

    @property
    def serialize(self):
        return {
            'name': self.name,
            'description': self.description,
            'id': self.id,
        }

您的 CategoryItem 表是父表。您正在其中设置关系,将类别作为子对象。当您拥有 cascage='delete-orphan' 时,这包括级联删除但具有附加行为(您可以在此处阅读更多信息:http://docs.sqlalchemy.org/en/latest/orm/cascades.html#delete

尝试从您的级联参数中删除 delete-orphan

【讨论】:

  • 谢谢。我发现如果我删除整个东西就可以了。 "cascade="all, delete-orphan"" 全部删除后。它工作!
  • 非常高兴我能提供帮助
猜你喜欢
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2018-04-12
  • 2019-04-03
相关资源
最近更新 更多