FastAPI 连接关系型数据库
connection 生成器将 FastAPI 连接到 Python 关系型数据库项目,通过 FastAPI 依赖项将类型化的 SQLModel 会话注入到您的路由处理程序中。
在使用此生成器之前,请确保您拥有:
- 一个
py#fast-api项目 - 一个
py#rdb项目
- 安装 Nx Console VSCode Plugin 如果您尚未安装
- 在VSCode中打开Nx控制台
- 点击
Generate (UI)在"Common Nx Commands"部分 - 搜索
@aws/nx-plugin - connection - 填写必需参数
- 点击
Generate
pnpm nx g @aws/nx-plugin:connectionyarn nx g @aws/nx-plugin:connectionnpx nx g @aws/nx-plugin:connectionbunx nx g @aws/nx-plugin:connection选择您的 FastAPI 项目作为源,选择您的关系型数据库项目作为目标。
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| sourceProject 必需 | string | - | 源项目 |
| targetProject 必需 | string | - | 要连接到的目标项目 |
| sourceComponent | string | - | 要从其连接的源组件(组件名称、相对于源项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为源。 |
| targetComponent | string | - | 要连接到的目标组件(组件名称、相对于目标项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为目标。 |
| preferInstallDependencies | boolean | true | 是否在生成器运行后优先安装依赖项。设置为 false 可在批量运行多个生成器时延迟安装(如果后续生成器需要计算 Nx 项目图,仍会运行安装);在最后统一安装一次。 |
生成器会修改您的 FastAPI 项目:
文件夹packages/my_api
- project.json 添加从
dev到数据库的dev目标的依赖关系 - pyproject.toml 将数据库包添加为工作区依赖项
文件夹my_api
文件夹dependencies
- my_db.py 用于数据库会话的 FastAPI
MyDbSession依赖项
- my_db.py 用于数据库会话的 FastAPI
- project.json 添加从
在路由处理程序中使用数据库
Section titled “在路由处理程序中使用数据库”此生成器配置了一个可注入的 FastAPI 依赖项,您可以在路由处理程序中使用它:
from sqlmodel import selectfrom my_api.dependencies.my_db import MyDbSessionfrom 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 itemFastAPI 会自动为每个请求打开一个新会话,并在处理程序返回时关闭它。
为了允许 FastAPI Lambda 函数在运行时连接到数据库,必须将其部署到与数据库相同的 VPC 中,并授予网络和 IAM 访问权限。
在您的应用程序堆栈中,将 API 部署到与数据库相同的 VPC 中,然后调用 allowDefaultPortFrom 和 grantConnect 来打开网络路径并授予 Lambda 处理程序 IAM rds-db:connect 权限:
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 服务端点。
将 API 部署到与数据库相同的 VPC 中,通过 additional_iam_policy_statements 授予它 rds-db:connect 权限,并使用一对安全组规则打开网络路径:
module "my_database" { source = "../../common/terraform/src/app/dbs/my-database" vpc_id = module.vpc.vpc_id database_subnet_ids = module.vpc.private_isolated_subnet_ids lambda_subnet_ids = module.vpc.private_subnet_ids}
module "api" { source = "..." enable_vpc = true vpc_id = module.vpc.vpc_id subnet_ids = module.vpc.private_subnet_ids
additional_iam_policy_statements = [ { Effect = "Allow" Action = ["rds-db:connect"] Resource = [ "arn:aws:rds-db:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:dbuser:${module.my_database.connect_resource_id}/${module.my_database.database_runtime_user}" ] } ]
env = { RUNTIME_CONFIG_APP_ID = module.runtime_config_appconfig.application_id }}
resource "aws_vpc_security_group_ingress_rule" "api_to_database" { security_group_id = module.my_database.security_group_id referenced_security_group_id = module.api.security_group_id from_port = module.my_database.cluster_port to_port = module.my_database.cluster_port ip_protocol = "tcp"}
resource "aws_vpc_security_group_egress_rule" "api_to_database" { security_group_id = module.api.security_group_id referenced_security_group_id = module.my_database.security_group_id from_port = module.my_database.cluster_port to_port = module.my_database.cluster_port ip_protocol = "tcp"}将 API Lambda 函数部署到具有出口的私有子网中,而不是私有隔离子网。RUNTIME_CONFIG_APP_ID 应指向共享的 运行时配置 AppConfig 应用程序,而不是数据库模块的输出。
pnpm nx dev <project-name>yarn nx dev <project-name>npx nx dev <project-name>bunx nx dev <project-name>这将启动 FastAPI 和所有连接的数据库。LOCAL_DEV=true 环境变量会导致数据库客户端连接到其本地 Docker 数据库而不是 Aurora。