Flask-SQLalchemy update a row's information Flask-SQLalchemy update a row's information python python

Flask-SQLalchemy update a row's information


Retrieve an object using the tutorial shown in the Flask-SQLAlchemy documentation. Once you have the entity that you want to change, change the entity itself. Then, db.session.commit().

For example:

admin = User.query.filter_by(username='admin').first()admin.email = 'my_new_email@example.com'db.session.commit()user = User.query.get(5)user.name = 'New Name'db.session.commit()

Flask-SQLAlchemy is based on SQLAlchemy, so be sure to check out the SQLAlchemy Docs as well.


There is a method update on BaseQuery object in SQLAlchemy, which is returned by filter_by.

num_rows_updated = User.query.filter_by(username='admin').update(dict(email='my_new_email@example.com')))db.session.commit()

The advantage of using update over changing the entity comes when there are many objects to be updated.

If you want to give add_user permission to all the admins,

rows_changed = User.query.filter_by(role='admin').update(dict(permission='add_user'))db.session.commit()

Notice that filter_by takes keyword arguments (use only one =) as opposed to filter which takes an expression.


This does not work if you modify a pickled attribute of the model. Pickled attributes should be replaced in order to trigger updates:

from flask import Flaskfrom flask.ext.sqlalchemy import SQLAlchemyfrom pprint import pprintapp = Flask(__name__)app.config['SQLALCHEMY_DATABASE_URI'] = 'sqllite:////tmp/users.db'db = SQLAlchemy(app)class User(db.Model):    id = db.Column(db.Integer, primary_key=True)    name = db.Column(db.String(80), unique=True)    data = db.Column(db.PickleType())    def __init__(self, name, data):        self.name = name        self.data = data    def __repr__(self):        return '<User %r>' % self.usernamedb.create_all()# Create a user.bob = User('Bob', {})db.session.add(bob)db.session.commit()# Retrieve the row by its name.bob = User.query.filter_by(name='Bob').first()pprint(bob.data)  # {}# Modifying data is ignored.bob.data['foo'] = 123db.session.commit()bob = User.query.filter_by(name='Bob').first()pprint(bob.data)  # {}# Replacing data is respected.bob.data = {'bar': 321}db.session.commit()bob = User.query.filter_by(name='Bob').first()pprint(bob.data)  # {'bar': 321}# Modifying data is ignored.bob.data['moo'] = 789db.session.commit()bob = User.query.filter_by(name='Bob').first()pprint(bob.data)  # {'bar': 321}