跳转到内容

FastAPI 连接关系型数据库

connection 生成器将 FastAPI 连接到 Python 关系型数据库项目,通过 FastAPI 依赖项将类型化的 SQLModel 会话注入到您的路由处理程序中。

在使用此生成器之前,请确保您拥有:

  1. 一个 py#fast-api 项目
  2. 一个 py#rdb 项目
  1. 安装 Nx Console VSCode Plugin 如果您尚未安装
  2. 在VSCode中打开Nx控制台
  3. 点击 Generate (UI) 在"Common Nx Commands"部分
  4. 搜索 @aws/nx-plugin - connection
  5. 填写必需参数
    • 点击 Generate

    选择您的 FastAPI 项目作为源,选择您的关系型数据库项目作为目标。

    参数类型默认值描述
    sourceProject 必需string-源项目
    targetProject 必需string-要连接到的目标项目
    sourceComponent string-要从其连接的源组件(组件名称、相对于源项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为源。
    targetComponent string-要连接到的目标组件(组件名称、相对于目标项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为目标。
    preferInstallDependencies booleantrue是否在生成器运行后优先安装依赖项。设置为 false 可在批量运行多个生成器时延迟安装(如果后续生成器需要计算 Nx 项目图,仍会运行安装);在最后统一安装一次。

    生成器会修改您的 FastAPI 项目:

    • 文件夹packages/my_api
      • project.json 添加从 dev 到数据库的 dev 目标的依赖关系
      • pyproject.toml 将数据库包添加为工作区依赖项
      • 文件夹my_api
        • 文件夹dependencies
          • my_db.py 用于数据库会话的 FastAPI MyDbSession 依赖项

    此生成器配置了一个可注入的 FastAPI 依赖项,您可以在路由处理程序中使用它:

    packages/my_api/my_api/api.py
    from sqlmodel import select
    from my_api.dependencies.my_db import MyDbSession
    from my_scope.my_db.models.example import ExampleModel
    @app.get("/examples")
    async def list_examples(my_db: MyDbSession):
    return (await my_db.execute(select(ExampleModel))).all()
    @app.post("/examples")
    async def create_example(name: str, my_db: MyDbSession):
    item = ExampleModel(name=name)
    my_db.add(item)
    await my_db.commit()
    await my_db.refresh(item)
    return item

    FastAPI 会自动为每个请求打开一个新会话,并在处理程序返回时关闭它。

    为了允许 FastAPI Lambda 函数在运行时连接到数据库,必须将其部署到与数据库相同的 VPC 中,并授予网络和 IAM 访问权限。

    在您的应用程序堆栈中,将 API 部署到与数据库相同的 VPC 中,然后调用 allowDefaultPortFromgrantConnect 来打开网络路径并授予 Lambda 处理程序 IAM rds-db:connect 权限:

    packages/infra/src/stacks/application-stack.ts
    import { MyDatabase } from ':my-scope/common-constructs';
    const db = new MyDatabase(this, 'Db', { vpc, ... });
    const api = new MyApi(this, 'Api', {
    integrations: MyApi.defaultIntegrations(this)
    .withDefaultOptions({
    vpc,
    vpcSubnets: { subnetType: SubnetType.PRIVATE_WITH_EGRESS },
    })
    .build(),
    });
    Object.entries(api.integrations).forEach(([operation, integration]) => {
    db.allowDefaultPortFrom(integration.handler, `Allow ${operation} to connect to the database`);
    db.grantConnect(integration.handler);
    });

    将 API Lambda 函数部署到具有出口的私有子网中,而不是私有隔离子网。在运行时,session_context() 从 AWS AppConfig 检索数据库配置,这是一个需要出站互联网访问的公共 AWS 服务端点。

    Terminal window
    pnpm nx dev <project-name>

    这将启动 FastAPI 和所有连接的数据库。LOCAL_DEV=true 环境变量会导致数据库客户端连接到其本地 Docker 数据库而不是 Aurora。