SQLAlchemy Cheatsheet

Setup

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///chat.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

Defining Models

class Message(db.Model):
    __tablename__ = 'messages'

    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String(500), nullable=False)
    sender = db.Column(db.String(20), nullable=False)
    timestamp = db.Column(db.DateTime, default=datetime.utcnow)

Column Types

Type Python Usage
db.Integer int IDs, counts
db.String(n) str Short text
db.Text str Long text
db.Boolean bool Flags
db.DateTime datetime Timestamps
db.Float float Numbers
db.JSON dict/list Complex data

Column Options

db.Column(db.Integer, primary_key=True)        # Auto-increment ID
db.Column(db.String, nullable=False)            # Required field
db.Column(db.String, unique=True)               # No duplicates
db.Column(db.String, default='user')            # Default value
db.Column(db.DateTime, default=datetime.utcnow) # Auto timestamp

Create Tables

# In Python shell or startup
with app.app_context():
    db.create_all()

Create Records

msg = Message(content="Hello!", sender="user")
db.session.add(msg)
db.session.commit()
print(msg.id)  # Auto-assigned

Query Records

# All records
Message.query.all()

# Filter
Message.query.filter_by(sender='user').all()
Message.query.filter(Message.content.contains('hello')).all()

# Get by ID
Message.query.get(5)

# Ordering
Message.query.order_by(Message.timestamp.desc()).all()
Message.query.order_by(Message.timestamp.asc()).all()

# Limit
Message.query.limit(10).all()

# Count
Message.query.count()
Message.query.filter_by(sender='ai').count()

# First match
Message.query.first()
Message.query.filter_by(sender='user').first()

# Chain
Message.query.filter_by(sender='user').order_by(Message.timestamp.desc()).limit(5).all()

Update Records

msg = Message.query.get(1)
msg.content = "Updated text"
db.session.commit()

Delete Records

msg = Message.query.get(1)
db.session.delete(msg)
db.session.commit()

# Delete matching
Message.query.filter_by(sender='user').delete()
db.session.commit()

Convert to Dict (for JSON)

def to_dict(self):
    return {
        'id': self.id,
        'content': self.content,
        'sender': self.sender,
        'timestamp': self.timestamp.isoformat() if self.timestamp else None
    }