SQLAlchemy 是 Python 标准 ORM 与 SQL 工具包。2.x API 对类型友好,并把 asyncio 作为一等公民支持:用 Mapped[...] 注解把模型声明为 Python 类,用 select() 编写查询,用 Alembic 管理表结构变更。当前版本线为 2.1(2.1.1,2026 年 9 月);2.0.x(最后为 2.0.54)适用于 Python 3.11 以下版本。
用途与主要能力:在同步或异步引擎上定义和查询关系型数据;支持类型化模型、关系加载、聚合查询、事务、迁移。2.1 相对 2.0 的变化:最低 Python 3.11;默认不再安装 greenlet,异步代码需 pip install "sqlalchemy[asyncio]",否则导入 sqlalchemy.ext.asyncio 会报 ImportError;无驱动名的 postgresql:// URL 默认改用 psycopg 3,保留旧驱动需写 postgresql+psycopg2://;Oracle 同样默认 python-oracledb;select(a, b) 类型为 Select[int, str](需 mypy 1.7+);会话在每个语句(含 text() 和 Core 语句)前自动 flush。
使用方式:安装 pip install "sqlalchemy[asyncio]" asyncpg alembic(PostgreSQL 用 asyncpg,SQLite 用 aiosqlite,MySQL 用 asyncmy);用 create_async_engine 与 async_sessionmaker 配置引擎(异步会话设 expire_on_commit=False);在 DeclarativeBase 子类上定义模型;查询用 select() 配合 selectinload 等预加载;写入放在 async with session.begin() 事务中;迁移用 alembic init -t async alembic、alembic revision --autogenerate -m "..."、alembic upgrade head、alembic downgrade -1,并在 alembic/env.py 中导入模型、设置 target_metadata = Base.metadata 与 sqlalchemy.url。
限制与注意:一个 AsyncSession 不可在并发任务间共享,每请求一个会话,关闭时调用 await engine.dispose();异步中读取未加载关系会抛 MissingGreenlet,需在查询中预加载或用 awaitable_attrs 并让 Base 继承 AsyncAttrs,也可对 relationship() 加 lazy="raise" 提前暴露问题;不要用 f-string 拼 SQL,应使用 select() 表达式或带绑定参数的 text();Alembic 的 autogenerate 不会识别表或列重命名(会生成删除加新增),且默认不比较 server default;数据库 URL 与密码应放在环境变量中。迁移到 2.1 需升到 Python 3.11+、加入 [asyncio] extra 并在 URL 中显式写驱动名。简单项目可考虑 SQLModel,但 SQLModel 0.0.47 锁定 SQLAlchemy<2.1.0;Django 项目内应使用 Django ORM。