Salta ai contenuti

FastAPI a Database Relazionale

Il generatore connection collega una FastAPI a un progetto Python Relational Database, iniettando una sessione SQLModel tipizzata nei tuoi gestori di route tramite una dipendenza FastAPI.

Prima di utilizzare questo generatore, assicurati di avere:

  1. Un progetto py#fast-api
  2. Un progetto py#rdb
  1. Installa il Nx Console VSCode Plugin se non l'hai già fatto
  2. Apri la console Nx in VSCode
  3. Clicca su Generate (UI) nella sezione "Common Nx Commands"
  4. Cerca @aws/nx-plugin - connection
  5. Compila i parametri richiesti
    • Clicca su Generate

    Seleziona il tuo progetto FastAPI come sorgente e il tuo progetto di database relazionale come destinazione.

    ParametroTipoPredefinitoDescrizione
    sourceProject Obbligatoriostring-Il progetto sorgente
    targetProject Obbligatoriostring-Il progetto di destinazione a cui connettersi
    sourceComponent string-Il componente sorgente da cui connettersi (nome del componente, percorso relativo alla radice del progetto sorgente, o id del generatore). Usare '.' per selezionare esplicitamente il progetto come sorgente.
    targetComponent string-Il componente di destinazione a cui connettersi (nome del componente, percorso relativo alla radice del progetto di destinazione, o id del generatore). Usare '.' per selezionare esplicitamente il progetto come destinazione.
    preferInstallDependencies booleantrueSe preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo dei progetti Nx); installare una volta alla fine.

    Il generatore modifica il tuo progetto FastAPI:

    • Directorypackages/my_api
      • project.json Aggiunge una dipendenza da dev al target dev del database
      • pyproject.toml Aggiunge il pacchetto del database come dipendenza del workspace
      • Directorymy_api
        • Directorydependencies
          • my_db.py Dipendenza FastAPI MyDbSession per la sessione del database

    Questo generatore configura una Dipendenza FastAPI iniettabile che puoi utilizzare nei tuoi gestori di route:

    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 apre automaticamente una nuova sessione per ogni richiesta e la chiude quando il gestore ritorna.

    Per consentire alla funzione Lambda FastAPI di connettersi al database a runtime, deve essere distribuita nello stesso VPC del database e deve avere accesso di rete e IAM.

    Nel tuo stack dell’applicazione, distribuisci l’API nello stesso VPC del database, quindi chiama allowDefaultPortFrom e grantConnect per aprire il percorso di rete e concedere il permesso IAM rds-db:connect al gestore 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);
    });

    Distribuisci le funzioni Lambda dell’API in una subnet privata con egress, non in una subnet privata isolata. A runtime, session_context() recupera la configurazione del database da AWS AppConfig, che è un endpoint di servizio AWS pubblico che richiede accesso internet in uscita.

    Terminal window
    pnpm nx dev <project-name>

    Questo avvia la FastAPI e tutti i database connessi. La variabile d’ambiente LOCAL_DEV=true fa sì che il client del database si connetta al suo database Docker locale invece che ad Aurora.