Pular para o conteúdo

FastAPI para Banco de Dados Relacional

O gerador connection conecta um FastAPI a um projeto de Banco de Dados Relacional Python, injetando uma sessão SQLModel tipada em seus manipuladores de rota via uma dependência FastAPI.

Antes de usar este gerador, certifique-se de ter:

  1. Um projeto FastAPI (gerado com py#api --framework=fastapi), veja o guia py#api
  2. Um projeto py#rdb
Terminal window
pnpm nx g @aws/nx-plugin:connection
Você também pode realizar uma execução simulada para ver quais arquivos seriam alterados
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

Selecione seu projeto FastAPI como origem e seu projeto de banco de dados relacional como destino.

ParâmetroTipoPadrãoDescrição
sourceProject Obrigatóriostring-O projeto de origem
targetProject Obrigatóriostring-O projeto de destino para conectar
sourceComponent string-O componente de origem para conectar (nome do componente, caminho relativo à raiz do projeto de origem, ou id do gerador). Use '.' para selecionar explicitamente o projeto como origem.
targetComponent string-O componente de destino para conectar (nome do componente, caminho relativo à raiz do projeto de destino, ou id do gerador). Use '.' para selecionar explicitamente o projeto como destino.
preferInstallDependencies booleantrueSe deve preferir instalar dependências após a execução do gerador. Defina como false para adiar a instalação ao executar múltiplos geradores em lote (uma instalação ainda é executada se necessário para que os geradores subsequentes possam calcular o grafo de projetos Nx); instale uma vez no final.

O gerador modifica seu projeto FastAPI:

  • Directorypackages/my_api
    • project.json Adiciona uma dependência de dev no target dev do banco de dados
    • pyproject.toml Adiciona o pacote do banco de dados como uma dependência de workspace
    • Directorymy_api
      • Directorydependencies
        • my_db.py Dependência FastAPI MyDbSession para a sessão do banco de dados

Este gerador configura uma Dependência FastAPI injetável que você pode usar em seus manipuladores de rota:

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

O FastAPI abre automaticamente uma nova sessão por requisição e a fecha quando o manipulador retorna.

Para permitir que a função Lambda FastAPI se conecte ao banco de dados em tempo de execução, ela deve ser implantada na mesma VPC que o banco de dados e receber acesso de rede e IAM.

Em sua pilha de aplicação, implante a API na mesma VPC que o banco de dados, depois chame allowDefaultPortFrom e grantConnect para abrir o caminho de rede e conceder permissão IAM rds-db:connect ao manipulador Lambda:

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);
});

Implante as funções Lambda da API em uma sub-rede privada com saída, não em uma sub-rede privada isolada. Em tempo de execução, session_context() recupera a configuração do banco de dados do AWS AppConfig, que é um endpoint de serviço AWS público que requer acesso à internet de saída.

Terminal window
pnpm nx dev <project-name>

Isso inicia o FastAPI e todos os bancos de dados conectados. A variável de ambiente LOCAL_DEV=true faz com que o cliente do banco de dados se conecte ao seu banco de dados Docker local em vez do Aurora.