yuyu
yuyu

Reputation: 144

Updating a specific row with Flask SQLAlchemy

I have this app with a profile and I want to update only a specific row based on its account id. Inserting the data works, but updating a specific row doesn't and I'm not sure which part is wrong with my code.

@app.route('/edit_parent/<int:acc_id>', methods=['GET','POST'])
def edit_parent(acc_id):
myParent = Parent.query.filter_by(acc_id=int(acc_id)).first()

if request.method == "POST":

    myParent.fname_p = request.form['fname_p']
    myParent.lname_p = request.form['lname_p']
    myParent.bday_p = request.form['bday_p']
    myParent.add_p = request.form['add_p']

    db.session.commit()
    print "hello success"
    return redirect(url_for('parent', acc_id=int(acc_id)))

if request.method == "GET":
    return render_template('edit_p.html', acc_id=int(acc_id))

It prints the "hello success" and redirects to the parent url but returns an error 302 and still no changes in the db.

Upvotes: 1

Views: 7510

Answers (2)

yuyu
yuyu

Reputation: 144

solved it by adding:

myParent = db.session.merge(myParent)

this way it merges the current session with the previous one. It still returns a 302 but the data on the db has been successfully updated.

Upvotes: 0

Iron Fist
Iron Fist

Reputation: 10951

I don't think you are updating a specific row at all, but instead you are just inserting new one each time with:

myParent = Parent(request.form['fname_p'], request.form['lname_p'], 
           request.form['bday_p'], request.form['add_p']).where(acc_id=acc_id)
db.session.add(myParent)`

So, what you are supposed to do instead is:

myParent = Parent.query.filter_by(acc_id=acc_id)

assuming your Parent db has the following attributes:

myParent.fname = request.form['fname_p']
myParent.lname = request.form['lname_p']
myParent.bday  = request.form['bday_p']
myParent.add   = request.form['add_p']

db.session.commit()

Upvotes: 2

Related Questions