Skip to content

Database with SQLAlchemy

使用 SQLAlchemy 进行 ORM 映射与数据库访问,推荐搭配 Flask-Migrate 管理迁移。

安装:

bash
pip install flask-sqlalchemy flask-migrate

初始化扩展:

python
# app/extensions.py
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

db = SQLAlchemy()
migrate = Migrate()

应用工厂注册:

python
# app/__init__.py
from .extensions import db, migrate

def create_app(config_object=None):
    app = Flask(__name__)
    app.config.from_mapping(SQLALCHEMY_DATABASE_URI="sqlite:///app.db",
                            SQLALCHEMY_TRACK_MODIFICATIONS=False)
    db.init_app(app)
    migrate.init_app(app, db)
    return app

定义模型:

python
# app/models.py
from .extensions import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True, nullable=False)
    name = db.Column(db.String(80))
    created_at = db.Column(db.DateTime, server_default=db.func.now())

基本操作:

python
u = User(email="a@ex.com", name="Alice")
db.session.add(u)
db.session.commit()

user = User.query.filter_by(email="a@ex.com").first()
user.name = "Alice Chen"
db.session.commit()

事务与回滚:

python
try:
    # 多表写入
    db.session.commit()
except Exception:
    db.session.rollback()
    raise

提示:在视图中避免直接写业务逻辑,抽到 service/dao 层以便测试;复杂查询使用 SQLAlchemy Core/ORM 组合。