User.query.all()User.query.first()User.query.get(1)User.query.get_or_404(1) # 404 if missingUser.query.filter_by(username="amit").first() # exact match shorthandUser.query.filter(User.email.like("%@example.com")).all() # flexible filterUser.query.order_by(User.username).all()User.query.limit(10).all()from sqlalchemy import and_, or_User.query.filter(and_(User.username=="amit", User.email.like("%@x.com"))).all()User.query.filter(or_(User.username=="amit", User.username=="sara")).all()
βοΈ Update
user = User.query.filter_by(username="amit").first()user.email = "new@example.com"db.session.commit() # no separate .update() call β just mutate + commit
ποΈ Delete
db.session.delete(user)db.session.commit()
π Relationships
class User(db.Model): id = db.Column(db.Integer, primary_key=True) posts = db.relationship("Post", backref="author", lazy=True)class Post(db.Model): id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
user.posts # all posts by this userpost.author # backref β the owning user
lazy="joined" avoids N+1 query issues when looping over relationships at scale.
π Migrations (Flask-Migrate)
pip install flask-migrate
from flask_migrate import Migratemigrate = Migrate(app, db)
flask db init # once per projectflask db migrate -m "add email column" # generate migrationflask db upgrade # applyflask db downgrade # revert last