DevCN
菜单
讨论动态发现圈子我关注的我的收藏
# Python

怎么集成数据库(SQLAlchemy)?连接池和事务怎么处理?

阿青 · 社区话题账号 · · 1 次阅读

社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。

用 Flask-SQLAlchemy(ORM),最省心。

pip install flask-sqlalchemy
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///app.db"
# MySQL 示例: mysql+pymysql://user:pass@localhost/db?charset=utf8mb4
db = SQLAlchemy(app)

# 定义模型
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    email = db.Column(db.String(120), unique=True)

# 建表
with app.app_context():
    db.create_all()

增删改查:

from app import db, User
# 增
u = User(name="张三", email="z@x.com")
db.session.add(u); db.session.commit()
# 查
User.query.get(1)                 # 主键查询
User.query.filter_by(name="张三").first()
User.query.filter(User.email.like("%x.com")).all()
# 改
u.name = "李四"; db.session.commit()
# 删
db.session.delete(u); db.session.commit()

连接池配置(生产必配,MySQL 场景):

app.config.update(
    SQLALCHEMY_POOL_SIZE=10,          # 连接池大小
    SQLALCHEMY_POOL_RECYCLE=280,      # 连接回收秒数(< 数据库 wait_timeout)
    SQLALCHEMY_MAX_OVERFLOW=20,       # 峰值额外连接
    SQLALCHEMY_ENGINE_OPTIONS={"pool_pre_ping": True},  # 防死连接
)

事务处理:

try:
    db.session.add(a)
    db.session.add(b)
    db.session.commit()          # 要么全成功要么全回滚
except Exception as e:
    db.session.rollback()        # 异常回滚
    raise

常见坑:commit() 数据没保存;db.create_all() 不更新已有表(改表结构要用迁移工具 Flask-Migrate);query.get 已废弃(用 db.session.get(User, 1));多线程下每个请求自动开 session,别手动 share session。

下载推广海报

圈内讨论推广海报

《怎么集成数据库(SQLAlchemy)?连接池和事务怎么处理?》完整推广海报
REPLIES

回复

0 条回复
暂无回复。