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 admin
s,
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}