怎么集成数据库(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。
回复
0 条回复