macos:新建fastapi项目之二:用sqlalchemy框架访问mysql数据库

一,安装所需的库

 %  pip install sqlalchemy aiomysql pydantic

二,代码

# main.py - 第一个FastAPI程序
from fastapi import FastAPI
from fastapi import APIRouter, Request, Depends
# app/core/database.py
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker

from sqlalchemy.orm import  Mapped, mapped_column
from sqlalchemy import String



from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select # 2.0 推荐使用 select 语法


# 数据库连接URL
# 格式:数据库类型+驱动://用户名:密码@主机:端口/数据库名
DATABASE_URL = "mysql+aiomysql://root:rootpassword@localhost:3306/my_base"

# 创建异步引擎
# engine 是数据库连接的核心对象,负责管理连接池
engine = create_async_engine(
    DATABASE_URL,
    echo=True,  # 打印SQL语句,方便调试,生产环境应设为False
    pool_size=10,  # 连接池大小
    max_overflow=20  # 连接池溢出后的最大连接数
)

# 创建会话工厂
# AsyncSessionLocal 可以创建数据库会话对象
AsyncSessionLocal = async_sessionmaker(engine, expire_on_commit=False)

# 创建模型基类
# 所有的数据模型都要继承这个类
Base = declarative_base()

# 获取数据库会话的依赖函数
async def get_db():
    async with AsyncSessionLocal() as session:
        try:
            yield session  # 把会话交给接口使用
            await session.commit()  # 正常结束则提交事务
        except Exception:
            await session.rollback()  # 发生异常则回滚
            raise
        finally:
            await session.close()  # 关闭会话




# 商品模型
class User(Base):
    __tablename__ = "user"

    id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True,comment='主键')
    username: Mapped[str] = mapped_column(String(100),server_default="''", comment='商品名称')



# 创建FastAPI应用实例
# 可以设置标题、描述、版本等元数据
app = FastAPI(
    title="我的第一个FastAPI应用",
    description="这是一个学习FastAPI的示例项目")

# 定义根路径GET请求
@app.get("/hello")
async def root():
    """
    根路径处理函数
    返回欢迎信息
    """
    return {
        "message": "Hello FastAPI!"
    }


@app.get("/all")
async def get_all_products(request: Request, db: AsyncSession = Depends(get_db)):
    # 异步写法不能直接用 db.query(),必须用 select
    skip = 0
    limit = 10
    stmt = select(User).offset(skip).limit(limit)
    result = await db.execute(stmt)  # 必须 await 数据库 I/O
    prods = result.scalars().all()
    res = {
        "list": prods,
    }
    return res

数据库内容:

image

三,测试效果:

 

image

 

posted @ 2026-09-19 17:00  刘宏缔的架构森林  阅读(6)  评论(0)    收藏  举报