SQLAlchemy教程:第一个例子-4.实现保存数据 作者:马育民 • 2026-08-16 18:41 • 阅读:10000 # 介绍 执行增删改查时,要使用 `session` 上下文管理器,执行后自动关闭会话,不用手动关闭: ``` async with AsyncSession(async_engine) as session: # 保存表模型对象 session.add(user) # 提交事务,不写此句不执行SQL语句 await session.commit() ``` # 实现 ### 定义保存函数 ``` async def save(user: User): # AsyncSession 使用上下文管理器,自动关闭会话 async with AsyncSession(async_engine) as session: try: session.add(user) # 成功执行才提交事务 await session.commit() except Exception as e: # 如果报错就回滚 await session.rollback() raise e ``` ### 执行 ``` async def main(): await init_table() # 创建对象,传入数据 user = User(username="lilei", password="123456") # 调用save方法 await save(user) # ✅关键:主动dispose释放全部连接,避免GC阶段触发报错 await async_engine.dispose() if __name__ == "__main__": asyncio.run(main()) ``` # 完整代码 ``` import asyncio from sqlalchemy import String, Integer from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column # 数据库链接 DB_URL = "mysql+aiomysql://root:root@127.0.0.1:3306/fastapi_std?charset=utf8mb4" async_engine = create_async_engine( DB_URL, echo=True, # True打印执行SQL,调试打开;生产关闭 pool_size=5, # 连接池大小 max_overflow=10, # 最大连接数量 ) class Base(DeclarativeBase): pass class User(Base): __tablename__ = "user" id: Mapped[int] = mapped_column(Integer(),primary_key=True,autoincrement=True,comment="主键") username: Mapped[str] = mapped_column(String(50),comment="") password: Mapped[int] = mapped_column(String(50),comment="密码") async def init_table(): async with async_engine.begin() as conn: # 删除旧表(测试用) # await conn.run_sync(Base.metadata.drop_all) # 创建表 await conn.run_sync(Base.metadata.create_all) async def save(user: User): # AsyncSession 使用上下文管理器,自动关闭会话 async with AsyncSession(async_engine) as session: try: session.add(user) # 成功执行才提交事务 await session.commit() except Exception as e: # 如果报错就回滚 await session.rollback() raise e async def main(): await init_table() # 添加数据 user = User(username="lilei", password="123456") await save(user) # ✅关键:主动dispose释放全部连接,避免GC阶段触发报错 await async_engine.dispose() if __name__ == "__main__": asyncio.run(main()) ``` 原文出处:/show_1GW3sDos7eZ8.html