Deleting row with Flask-SQLAlchemy

Question:

I’m trying to make a function to delete a record in my database with flask and the extension for SQLAlchemy. Problem is, instead of deleting just one row, it deletes all of them. Can someone tell me what’s wrong with my code?

@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)

Thanks in advance!

Asked By: Tom Brunoli

||

Answers:

I suspect that this line does not what you think.

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

You’re getting a single instance (which you already did before), and by using query you actually issue a new query over all objects without filtering and therefore deleting all of them.

Probably what you want to do is this:

    db.session.delete(page)
Answered By: Reiner Gerecke
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.