You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI搭配SQLAlchemy 2.0出现ImportError的问题求助

解决SQLAlchemy 2.0与FastAPI结合时的ImportError问题

问题核心

你遇到的ImportError: cannot import name 'DeclarativeBase' from 'sqlalchemy.orm'本质是运行FastAPI时的Python环境中,SQLAlchemy版本低于2.0.0——DeclarativeBase是SQLAlchemy 2.0才引入的新特性,旧版本没有这个类。

为什么注释FastAPI代码后能正常运行?因为此时脚本直接在你安装了SQLAlchemy 2.0的环境里执行;而启动FastAPI时,可能用了另一个未更新SQLAlchemy的环境(比如全局Python环境、未激活的虚拟环境)。

解决步骤

  • 确认环境版本一致性
    在脚本开头添加版本打印代码,分别在注释/不注释FastAPI代码的情况下运行,对比输出的版本号:

    import sqlalchemy
    print("当前SQLAlchemy版本:", sqlalchemy.__version__)
    

    如果两个场景版本不同,说明启动FastAPI时用错了环境。

  • 确保FastAPI使用正确的虚拟环境
    如果你用了虚拟环境,先激活它,再运行脚本或用uvicorn直接启动:

    # 激活虚拟环境(以venv为例)
    source venv/bin/activate  # macOS/Linux
    venv\Scripts\activate     # Windows
    # 启动FastAPI
    python your_script.py
    # 或者用uvicorn直接启动
    uvicorn your_script:app --host 127.0.0.1 --port 8000
    
  • 强制安装指定版本的SQLAlchemy
    在正确的环境下执行命令,确保安装的是2.0及以上版本:

    pip install --upgrade sqlalchemy>=2.0.0
    

    FastAPI与SQLAlchemy 2.0没有已知兼容性问题,两者可以正常配合使用。

  • 修复代码中的类型错误
    你的AddUser模型里age定义为str,但User数据库模型里age是Mapped[int],直接赋值会导致数据库类型错误,需要修改AddUser:

    class AddUser(BaseModel):
        name: str
        age: int  # 改为int类型
    

    另外,FastAPI的接口不需要手动json.dumps,直接返回字典即可,框架会自动处理JSON序列化:

    @app.post("/users/")
    async def post_user(add_user: AddUser):
        with Session(engine) as session:
            user = User(name=add_user.name, age=add_user.age)
            session.add(user)
            session.commit()
            session.refresh(user)  # 刷新获取数据库生成的id等字段
        return {"name": user.name, "age": user.age}
    

内容的提问来源于stack exchange,提问作者Lev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:02:37