跳转到内容

FastAPI 到关系数据库

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

在使用此生成器之前,请确保您已具备:

  1. 一个 FastAPI 项目(使用 py#api --framework=fastapi 生成),请参阅 py#api 指南
  2. 一个 py#rdb 项目
Terminal window
pnpm nx g @aws/nx-plugin:connection
您还可以执行试运行以查看哪些文件会被更改
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

选择您的 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 Dependency,您可以在路由处理程序中使用它:

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。