现在写后端程序,谁还愿意卡在数据库查询上?尤其是做 Web 服务的时候,一个接口等三秒才返回,用户早就关了。很多人开始用异步ref="/tag/154/" style="color:#EB6E00;font-weight:bold;">框架,比如 Python 的 FastAPI 或 Node.js 的 Express 配合 async/await,这时候自然会问:我用的 ORM 框架能不能跟上节奏,支持异步操作?
主流 ORM 现在都“动”起来了
以前的 ORM,像 Django ORM 或 SQLAlchemy 1.x,全是同步的。你查个用户信息,代码就停那儿等着数据库响应。但现在不一样了,随着异步生态成熟,大多数主流 ORM 已经支持异步操作。
Python:SQLAlchemy 2.0 + asyncio 才是正解
Django ORM 目前还不原生支持异步查询,虽然有第三方方案,但用起来总有点别扭。而 SQLAlchemy 从 1.4 开始引入 async 支持,到了 2.0 更是全面拥抱 asyncio。配合 asyncpg 或 aiomysql 这类异步驱动,可以直接在 FastAPI 里写异步视图。
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
engine = create_async_engine("postgresql+asyncpg://user:pass@localhost/db", echo=True)
AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async def get_user(user_id):
async with AsyncSessionLocal() as session:
result = await session.execute(select(User).where(User.id == user_id))
return result.scalar_one_or_none()
这段代码不会阻塞整个事件循环,多个请求进来也能高效处理。
Node.js:Sequelize 和 TypeORM 都行
Node 本身就是异步环境,所以 Sequelize 从一开始就能用 Promise。现在调用 findByPk 或 save() 返回的都是 Promise,直接 await 就完事。
const user = await User.findByPk(123);
user.name = 'new name';
await user.save();
TypeORM 也一样,配合装饰器和 async/await,写起来很顺。不过要注意连接池配置,别让数据库撑不住。
.NET 和 Java 也不落后
Entity Framework Core 从 2.0 开始提供 SaveChangesAsync、ToListAsync 这些方法,ASP.NET Core 配合起来毫无压力。Spring Data JPA 原本是同步为主,但 Spring WebFlux + R2DBC 组合可以实现完全响应式的数据访问,适合高并发场景。
异步不是银弹,得看实际需求
如果你做的是内部管理后台,每天几百访问量,用同步 ORM 完全没问题,简单稳定。但要做高并发 API,比如商品抢购、实时消息推送,异步 ORM 能显著提升吞吐量。前提是数据库连接也得支持异步协议,不然光代码异步没用。
现在很多云服务推荐异步架构,比如部署在 Vercel 或 AWS Lambda 上的接口函数,响应时间敏感,用异步 ORM 能更快释放资源,省成本。