SQLAlchemy
SQLAlchemy 是 Python 下成熟的 ORM 与 SQL 工具库,支持多种数据库方言,换库(如从 SQLite 到 PostgreSQL)时几乎不用改业务代码。详见 SQLAlchemy 2.0 官方文档。
安装与引擎
pip install sqlalchemy
# 使用 PostgreSQL 时通常还需:pip install psycopg2-binary
所有连接都从 Engine 开始。Engine 是连接池与数据库 URL 的入口,应用内通常全局只建一个:
from sqlalchemy import create_engine
engine = create_engine("sqlite:///:memory:", echo=True)
# PostgreSQL: "postgresql+psycopg2://user:pass@host:5432/dbname"
# MySQL: "mysql+pymysql://user:pass@host:3306/dbname"
- URL 含义:
方言+驱动://用户:密码@主机:端口/库名。SQLite 无服务端,用/:memory:表示内存库。 - echo=True:把发出的 SQL 打印到标准输出,调试用;生产应关闭。
- 连接池:默认每个 Engine 自带连接池(如 QueuePool),无需手写连接管理;高并发时可调
pool_size、max_overflow。
tip
Engine 不持有“当前连接”;占用连接的是 engine.connect() 或通过 Session 发起的操作。请求级、短生命周期的 Session 配全局单例 Engine 即可。
基本运行示例
下面这段可在本机直接运行(内存 SQLite,无需装数据库)。后文中的 engine、Base、User 均沿用此处定义。
from sqlalchemy import create_engine, select, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
engine = create_engine("sqlite:///:memory:", echo=False)
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "user_account"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(30), nullable=False)
email: Mapped[str] = mapped_column(String(255), nullable=False)
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(User(name="alice", email="alice@example.com"))
session.add(User(name="bob", email="bob@example.com"))
session.commit()
with Session(engine) as session:
stmt = select(User).where(User.name == "alice")
user = session.scalars(stmt).first()
print(user.name, user.email) # alice alice@example.com