Ir al contenido

FastAPI a Base de Datos Relacional

El generador connection conecta una FastAPI a un proyecto de Base de Datos Relacional de Python, inyectando una sesión SQLModel tipada en tus manejadores de rutas a través de una dependencia de FastAPI.

Antes de usar este generador, asegúrate de tener:

  1. Un proyecto py#fast-api
  2. Un proyecto py#rdb
  1. Instale el Nx Console VSCode Plugin si aún no lo ha hecho
  2. Abra la consola Nx en VSCode
  3. Haga clic en Generate (UI) en la sección "Common Nx Commands"
  4. Busque @aws/nx-plugin - connection
  5. Complete los parámetros requeridos
    • Haga clic en Generate

    Selecciona tu proyecto FastAPI como origen y tu proyecto de base de datos relacional como destino.

    ParámetroTipoPredeterminadoDescripción
    sourceProject Requeridostring-El proyecto de origen
    targetProject Requeridostring-El proyecto de destino al que conectar
    sourceComponent string-El componente de origen desde el que conectar (nombre del componente, ruta relativa a la raíz del proyecto de origen, o id del generador). Use '.' para seleccionar explícitamente el proyecto como origen.
    targetComponent string-El componente de destino al que conectar (nombre del componente, ruta relativa a la raíz del proyecto de destino, o id del generador). Use '.' para seleccionar explícitamente el proyecto como destino.
    preferInstallDependencies booleantrueSi se prefiere instalar las dependencias después de que se ejecute el generador. Establecer en false para diferir la instalación al ejecutar múltiples generadores en lote (la instalación aún se ejecuta si es necesario para que los generadores subsiguientes puedan calcular el grafo de proyectos de Nx); instalar una vez al final.

    El generador modifica tu proyecto FastAPI:

    • Directoriopackages/my_api
      • project.json Agrega una dependencia de dev en el objetivo dev de la base de datos
      • pyproject.toml Agrega el paquete de base de datos como una dependencia del espacio de trabajo
      • Directoriomy_api
        • Directoriodependencies
          • my_db.py Dependencia MyDbSession de FastAPI para la sesión de base de datos

    Usar la Base de Datos en Manejadores de Rutas

    Sección titulada «Usar la Base de Datos en Manejadores de Rutas»

    Este generador configura una Dependencia de FastAPI inyectable que puedes usar en tus manejadores de rutas:

    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 abre automáticamente una nueva sesión por solicitud y la cierra cuando el manejador retorna.

    Para permitir que la función Lambda de FastAPI se conecte a la base de datos en tiempo de ejecución, debe desplegarse en la misma VPC que la base de datos y se le debe otorgar acceso de red e IAM.

    En tu stack de aplicación, despliega la API en la misma VPC que la base de datos, luego llama a allowDefaultPortFrom y grantConnect para abrir la ruta de red y otorgar el permiso IAM rds-db:connect al manejador 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);
    });

    Despliega las funciones Lambda de la API en una subred privada con salida, no en una subred privada aislada. En tiempo de ejecución, session_context() recupera la configuración de la base de datos desde AWS AppConfig, que es un endpoint de servicio público de AWS que requiere acceso a internet saliente.

    Terminal window
    pnpm nx dev <project-name>

    Esto inicia la FastAPI y todas las bases de datos conectadas. La variable de entorno LOCAL_DEV=true hace que el cliente de base de datos se conecte a su base de datos Docker local en lugar de Aurora.