Mustafa Khan
Mustafa Khan

Reputation: 417

Sqlalchemy: Database delete error

For the following function

def deleteMenuItem(restaurant_id,menu_id):
    if request.method == 'POST':
        item = session.query(MenuItem).filter_by(id = menu_id)
        session.delete(item)
        session.commit()
        return redirect(url_for('showMenu',restaurant_id =restaurant_id))
    else:
        return render_template('deletemenu.html',restaurant_id=restaurant_id,menu_id=menu_id)

When I try to delete an item. I get the following error

sqlalchemy.orm.exc.UnmappedInstanceError UnmappedInstanceError: Class 'sqlalchemy.orm.query.Query' is not mapped

The error can be fixed if I do the following change to the code

item = session.query(MenuItem).filter_by(id = menu_id).one()

I am not sure why the .one() fixes the problem. Since the query itself will always find one result. So why is the .one() needed?

Upvotes: 5

Views: 11093

Answers (1)

Holloway
Holloway

Reputation: 7367

The session.query(MenuItem).filter_by(id=menu_id) returns a Query object that can be used to filter or order the results, not the results themselves.

one() returns the first object the query finds.

When you try to delete the query, it complains that the Query object is not mapped.

Docs are here. The Query object also has a delete method that will delete all matched objects.

Upvotes: 11

Related Questions