使用Flask-SQLAlchemy删除行

15

我正在尝试使用Flask和SQLAlchemy扩展程序创建一个用于从数据库中删除记录的函数。问题是,它不仅删除了一行,而是将所有行都删除了。请问我的代码有什么问题?

@app.route('/admin/delete/<int:page_id>', methods=['GET','POST'])
@requires_auth
def delete_page(page_id):
    page = Page.query.get(page_id)
    if not page:
        abort(404)
    if page.children:
        flash('You can not delete a page with child pages. Delete them, or assign them a different parent.',
              'error')
        return redirect(url_for('admin_page'))
    if request.method == 'POST':
        Page.query.get(page_id).query.delete()
        db.session.commit()
        flash('Page was deleted successfully', 'success')
        return redirect(url_for('admin_page'))
    return render_template('admin_delete.html', page_title=page.title, page_id=page_id)

提前致谢!

1个回答

32

我怀疑这行代码并没有做你想要的事情。

    Page.query.get(page_id).query.delete()

你已经获得了一个单一的实例(之前已经做过了),而使用 query 实际上会发出一个新的查询,涵盖所有对象且没有筛选条件,因此会删除所有对象。

可能你想要做的是这样的:

    db.session.delete(page)

令人烦恼的是,它实际上有一个错误(我已经尝试过了)AttributeError: 'Page' object has no attribute 'delete' - Tom Brunoli
@tominated 我现在自己尝试了一下,并更新了我的答案,提供了一个解决方案。 - Reiner Gerecke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接