我在这个项目中使用 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"> 
<input type="submit" value ="Delete">
<a href = "{{url_for('showItem',categories_id=categories_id, items_id=items_id)}}"><button type="button">Cancel</button></a>
我不确定是什么导致了这个问题。
最佳答案
这是因为您设置了与级联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
关于python - sqlalchemy删除功能问题,我想删除单个项目,但实际上删除了整个类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52248002/