Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 626
Mustafa Khan Avatar asked Jan 26 '16 12:01

Mustafa Khan


1 Answers

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.

like image 102
Holloway Avatar answered Oct 16 '22 00:10

Holloway