Tom Brunoli
Tom Brunoli

Reputation: 3476

Deleting row with Flask-SQLAlchemy

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!

Upvotes: 15

Views: 15729

Answers (1)

Reiner Gerecke
Reiner Gerecke

Reputation: 12214

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)

Upvotes: 32

Related Questions