Condividi tramite


Esercitazione: Aggiungere una connessione al database MySQL in Azure Static Web Apps (anteprima)

In questo tutorial, impari a connettere un database flessibile di Azure per MySQL alla tua app web statica. Dopo la configurazione, è possibile effettuare richieste REST o GraphQL all'endpoint predefinito per modificare i dati senza dover scrivere codice back-end /data-api .

Per semplicità, questa esercitazione illustra come usare un database di Azure a scopo di sviluppo locale, ma è anche possibile usare un server di database locale per le esigenze di sviluppo locali.

Annotazioni

Questa esercitazione illustra come usare il server flessibile di Database di Azure per MySQL. Per usare un altro database, vedere le esercitazioni su Azure Cosmos DB, Azure SQL o PostgreSQL .

Web browser che mostra i risultati di MySQL nella finestra della console degli strumenti di sviluppo.

In questa esercitazione, imparerai a:

  • Collegare un database di Azure Database per MySQL all'app Web statica
  • Creare, leggere, aggiornare ed eliminare dati

Prerequisiti

Per completare questa esercitazione, è necessario avere un database di Azure per MySQL esistente e un'app Web statica. È anche necessario installare Visual Studio Code.

Conto risorse Description
Server flessibile di Database di Azure per MySQL Se è necessario creare un database, seguire la procedura descritta nella guida creare un server flessibile di Database di Azure per MySQL . Se si prevede di usare un'autenticazione della stringa di connessione per l'app Web, assicurarsi di creare il database con l'autenticazione MySQL. È possibile modificare questa impostazione in un secondo momento se si vuole usare l'identità gestita in un secondo momento.
App Web statica esistente Se non è già disponibile, seguire la procedura descritta nella guida introduttiva per creare un'app Web statica No Framework .
Visual Studio Code, con l'estensione Shell MySQL Se Visual Studio Code non è già installato, seguire la guida per installare Visual Studio Code con l'estensione MySQL Shell. In alternativa, è possibile usare qualsiasi altro strumento per eseguire query sul database MySQL, ad esempio MySQL Workbench.

Per iniziare, configurare il database in modo che funzioni con la funzionalità di connessione al database di App Web statiche di Azure.

Configurare la connettività del database

Le app Web statiche di Azure devono avere accesso di rete al database per consentire il funzionamento delle connessioni al database. Inoltre, per usare un database di Azure per lo sviluppo locale, è necessario configurare il database per consentire le richieste provenienti dal proprio indirizzo IP.

  1. Vai al tuo server flessibile di Azure Database per MySQL nel portale di Azure.

  2. Nella sezione Impostazioni, selezionare Rete.

  3. Nella sezione Regole del firewall selezionare il pulsante Aggiungi l'indirizzo IP del client corrente . Questo passaggio garantisce che sia possibile usare questo database per lo sviluppo locale.

  4. Nella sezione Regole del firewall selezionare la casella di controllo Consenti l'accesso pubblico da qualsiasi servizio di Azure in Azure a questo server . Questo passaggio garantisce che la risorsa app Web statica distribuita possa accedere al database.

  5. Seleziona Salva.

Ottenere la stringa di connessione del database per lo sviluppo locale

Per usare il database di Azure per lo sviluppo locale, è necessario recuperare la stringa di connessione del database. È possibile ignorare questo passaggio se si prevede di usare un database locale a scopo di sviluppo.

  1. Passare al server flessibile del database di Azure per MySQL nel portale di Azure.

  2. Nella sezione Impostazioni selezionare Connetti.

  3. Nella sezione Connetti dall'app selezionare la stringa di connessione ADO.NET e salvarla in un editor di testo.

  4. Sostituire il {your_password} segnaposto nella stringa di connessione con la password.

  5. Sostituire il {your_database} segnaposto con il nome MyTestPersonDatabasedel database . Creerai il MyTestPersonDatabase nei prossimi passaggi.

  6. Eliminare le sezioni SslMode e SslCa della stringa di connessione perché richiedono passaggi aggiuntivi e sono destinati a scopi di produzione.

Creare dati di esempio

Creare una tabella di esempio e eseguire il seeding con i dati di esempio in modo che corrispondano all'esercitazione. In questo caso è possibile usare Visual Studio Code, ma è possibile usare MySQL Workbench o qualsiasi altro strumento.

  1. In Visual Studio Code con l'estensione Shell MySQL creare una connessione al server flessibile di Azure MySQL.

  2. Fare clic con il pulsante destro del mouse sul server e creare un nuovo database. Immettere MyTestPersonDatabase come nome del database e selezionare il set di caratteri come utf8mb4 e le regole di confronto come utf8mb4_0900_ai_ci.

  3. Fare clic con il pulsante destro del mouse sul server e scegliere Aggiorna.

  4. Fare clic con il MyTestPersonDatabase pulsante destro del mouse sul database e scegliere Nuova query. Eseguire lo script seguente per creare una nuova tabella denominata MyTestPersonTable.

    CREATE TABLE MyTestPersonTable (
        Id INT AUTO_INCREMENT NOT NULL,
        Name VARCHAR(25) NULL,
        PRIMARY KEY (Id)
    );
    
  5. Eseguire lo script seguente per aggiungere dati nella MyTestPersonTable tabella.

    INSERT INTO MyTestPersonTable (Name)
    VALUES ('Sunny');
    
    INSERT INTO MyTestPersonTable (Name)
    VALUES ('Dheeraj');
    
  6. Fare clic con il MyTestPersonTable pulsante destro del mouse sulla tabella e selezionare Seleziona primi 1000 per verificare che siano presenti dati nel database.

Configurare l'app Web statica

La parte restante di questa esercitazione è incentrata sulla modifica del codice sorgente dell'app Web statica per l'uso delle connessioni di database in locale.

Importante

I passaggi seguenti presuppongono che si stia usando l'app Web statica creata nella guida introduttiva. Se si usa un progetto diverso, assicurarsi di modificare i comandi Git seguenti in modo che corrispondano ai nomi dei rami.

  1. Passa al main branch.

    git checkout main
    
  2. Sincronizzare la versione locale con gli elementi in GitHub usando git pull.

    git pull origin main
    

Creare il file di configurazione del database

Creare quindi il file di configurazione usato dall'app Web statica per interfacciarsi con il database.

  1. Aprire il terminale e creare una nuova variabile per contenere la stringa di connessione. La sintassi specifica può variare a seconda del tipo di shell in uso.

    export DATABASE_CONNECTION_STRING='<YOUR_CONNECTION_STRING>'
    

    Assicurarsi di sostituire <YOUR_CONNECTION_STRING> con il valore della stringa di connessione impostato in un editor di testo.

  2. Usare npm per installare o aggiornare l'interfaccia della riga di comando di App Web statiche. Selezionare il comando migliore per la situazione.

    Per eseguire l'installazione, usare npm install.

    npm install -g @azure/static-web-apps-cli
    

    Per eseguire l'aggiornamento, usare npm update.

    npm update
    
  3. Usare il swa db init comando per generare un file di configurazione del database.

    swa db init --database-type mysql
    

    Il init comando crea il file staticwebapp.database.config.json nella cartella swa-db-connections .

  4. Incollare questo esempio nel file staticwebapp.database.config.json generato.

{
  "$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
  "data-source": {
    "database-type": "mysql",
    "options": {
      "set-session-context": false 
    },
    "connection-string": "@env('DATABASE_CONNECTION_STRING')"
  },
  "runtime": {
    "rest": {
      "enabled": true,
      "path": "/rest"
    },
    "graphql": {
      "allow-introspection": true,
      "enabled": true,
      "path": "/graphql"
    },
    "host": {
      "mode": "production",
      "cors": {
        "origins": ["http://localhost:4280"],
        "allow-credentials": false
      },
      "authentication": {
        "provider": "StaticWebApps"
      }
    }
  },
  "entities": {
    "Person": {
      "source": "MyTestPersonTable",
      "permissions": [
        {
          "actions": ["*"],
          "role": "anonymous"
        }
      ]
    }
  }
}

Prima di passare al passaggio successivo, esaminare la tabella seguente che illustra i diversi aspetti del file di configurazione. Per la documentazione completa sul file di configurazione, vedere la documentazione di Generatore API dati.

Caratteristica / Funzionalità Explanation
Connessione al database In fase di sviluppo, il runtime legge la stringa di connessione dal valore della stringa di connessione nel file di configurazione. Sebbene sia possibile specificare la stringa di connessione direttamente nel file di configurazione, è consigliabile archiviare le stringhe di connessione in una variabile di ambiente locale. È possibile fare riferimento ai valori delle variabili di ambiente nel file di configurazione tramite la @env('DATABASE_CONNECTION_STRING') notazione . Il valore della stringa di connessione viene sovrascritto da Static Web Apps per il sito distribuito con le informazioni raccolte quando il database viene collegato.
Endpoint API L'endpoint REST è disponibile tramite /data-api/rest mentre l'endpoint GraphQL è disponibile tramite /data-api/graphql come configurato in questo file di configurazione. È possibile configurare i percorsi REST e GraphQL, ma il /data-api prefisso non è configurabile.
Sicurezza API Le runtime.host.cors impostazioni consentono di definire le origini consentite che possono effettuare richieste all'API. In questo caso, la configurazione riflette un ambiente di sviluppo e consente di specificare il http://localhost:4280 percorso.
Modello di entità Definisce le entità esposte tramite route nell'API REST o come tipi nello schema GraphQL. In questo caso, il nome Person è il nome esposto all'endpoint mentre entities.<NAME>.source è lo schema del database e il mapping delle tabelle. Si noti che il nome dell'endpoint API non deve essere identico al nome della tabella.
Sicurezza delle entità Le regole delle autorizzazioni elencate nella entity.<NAME>.permissions matrice controllano le impostazioni di autorizzazione per un'entità. È possibile proteggere un'entità con ruoli nello stesso modo in cui si proteggono le route con i ruoli.

Annotazioni

Le proprietà connection-string, host.mode e graphql.allow-introspection del file di configurazione vengono sovrascritte quando distribuisci il tuo sito. La stringa di connessione viene sovrascritta con i dettagli di autenticazione raccolti quando connetti il database alla risorsa di App Web statica. La host.mode proprietà è impostata su productione la graphql.allow-introspection proprietà è impostata su false. Queste sostituzioni garantiscono coerenza nei file di configurazione nei carichi di lavoro di sviluppo e produzione, assicurando al tempo stesso che la risorsa app Web statica con connessioni di database abilitate sia sicura e pronta per l'ambiente di produzione.

Dopo aver configurato l'app Web statica per connettersi al database, è ora possibile verificare la connessione.

Aggiornare la home page

Sostituire il markup tra i body tag nel file index.html con il codice HTML seguente.

<h1>Static Web Apps Database Connections</h1>
<blockquote>
    Open the console in the browser developer tools to see the API responses.
</blockquote>
<div>
    <button id="list" onclick="list()">List</button>
    <button id="get" onclick="get()">Get</button>
    <button id="update" onclick="update()">Update</button>
    <button id="create" onclick="create()">Create</button>
    <button id="delete" onclick="del()">Delete</button>
</div>
<script>
    // add JavaScript here
</script>

Avviare l'applicazione in locale

È ora possibile eseguire il sito Web e modificare direttamente i dati nel database.

  1. Avviare l'app Web statica con la configurazione del database.

    swa start --data-api-location swa-db-connections
    

Ora che l'interfaccia della riga di comando è stata avviata, è possibile accedere al database tramite gli endpoint definiti nel file staticwebapp.database.config.json .

L'endpoint http://localhost:4280/data-api/rest/<ENTITY_NAME> accetta GET, PUTPOSTe DELETE richiede di modificare i dati nel database.

L'endpoint http://localhost:4280/data-api/graphql accetta query e mutazioni GraphQL.

Manipolare i dati

I comandi indipendenti dal framework seguenti illustrano come eseguire operazioni CRUD complete nel database.

L'output per ogni funzione viene visualizzato nella finestra della console del browser.

Aprire gli strumenti di sviluppo premendo CMD/CTRL + MAIUSC + I e selezionare la scheda Console .

Elencare tutti gli elementi

Aggiungere il codice seguente tra i script tag in index.html.

async function list() {
  const endpoint = '/data-api/rest/Person';
  const response = await fetch(endpoint);
  const data = await response.json();
  console.table(data.value);
}

In questo esempio:

  • La richiesta predefinita per l'API fetch usa il verbo GET.
  • I dati nel payload di risposta si trovano nella proprietà value.
async function list() {

  const query = `
      {
        people {
          items {
            Id
            Name
          }
        }
      }`;

  const endpoint = "/data-api/graphql";
  const response = await fetch(endpoint, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ query: query })
  });
  const result = await response.json();
  console.table(result.data.people.items);
}

In questo esempio:

  • La query GraphQL seleziona i campi Id e Name dal database.
  • La richiesta passata al server richiede un payload in cui la query proprietà contiene la definizione della query.
  • I dati nel payload di risposta data.people.items si trovano nella proprietà.

Aggiornare la pagina e selezionare il pulsante Elenco .

La finestra della console del browser visualizza ora una tabella che elenca tutti i record nel database.

Documento d'identità Nome
1 Sunny
2 Dheeraj

Di seguito è riportato uno screenshot dell'aspetto che dovrebbe essere visualizzato nel browser.

Web browser che mostra i risultati di una selezione di database nella finestra della console degli strumenti di sviluppo.

Recupera per ID

Aggiungere il codice seguente tra i script tag in index.html.

async function get() {
  const id = 1;
  const endpoint = `/data-api/rest/Person/Id`;
  const response = await fetch(`${endpoint}/${id}`);
  const result = await response.json();
  console.table(result.value);
}

In questo esempio:

  • L'endpoint è seguito da /person/Id.
  • Il valore ID viene aggiunto alla fine della posizione dell'endpoint.
  • I dati nel payload della value risposta si trovano nella proprietà .
async function get() {

  const id = 1;

  const gql = `
    query getById($id: Int!) {
      person_by_pk(Id: $id) {
        Id
        Name
      }
    }`;

  const query = {
    query: gql,
    variables: {
      id: id,
    },
  };

  const endpoint = "/data-api/graphql";
  const response = await fetch(endpoint, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(query),
  });
  const result = await response.json();
  console.table(result.data.person_by_pk);
}

In questo esempio:

  • La query GraphQL seleziona i campi Id e Name dal database.
  • La richiesta passata al server richiede un payload in cui la query proprietà contiene la definizione della query.
  • I dati nel payload della data.person_by_pk risposta si trovano nella proprietà .

Aggiornare la pagina e selezionare il pulsante Recupera .

La finestra della console del browser visualizza ora una tabella che elenca il singolo record richiesto dal database.

Documento d'identità Nome
1 Sunny

Update

Aggiungere il codice seguente tra i script tag in index.html.

Le App Web statiche supportano sia il verbo PUT che il verbo PATCH. Una PUT richiesta aggiorna l'intero record, mentre PATCH esegue un aggiornamento parziale.

async function update() {

  const id = 1;
  const data = {
    Name: "Molly"
  };

  const endpoint = '/data-api/rest/Person/Id';
  const response = await fetch(`${endpoint}/${id}`, {
    method: "PUT",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(data)
  });
  const result = await response.json();
  console.table(result.value);
}

In questo esempio:

  • L'endpoint è dotato di un suffisso /person/Id/.
  • Il valore ID viene aggiunto alla fine del percorso dell'endpoint.
  • Il verbo REST consiste PUT nell'aggiornare il record del database.
  • I dati nel payload della value risposta si trovano nella proprietà .
async function update() {

  const id = 1;
  const data = {
    Name: "Molly"
  };

  const gql = `
    mutation update($id: Int!, $item: UpdatePersonInput!) {
      updatePerson(Id: $id, item: $item) {
        Id
        Name
      }
    }`;

  const query = {
    query: gql,
    variables: {
      id: id,
      item: data
    } 
  };

  const endpoint = "/data-api/graphql";
  const res = await fetch(endpoint, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(query)
  });

  const result = await res.json();
  console.table(result.data.updatePerson);
}

In questo esempio:

  • La query GraphQL seleziona i campi Id e Name dal database.
  • L'oggetto query contiene la query GraphQL nella query proprietà .
  • I valori dell'argomento per la funzione GraphQL vengono passati tramite la query.variables proprietà .
  • La richiesta passata al server richiede un payload in cui la query proprietà contiene la definizione della query.
  • I dati nel payload della data.updatePerson risposta si trovano nella proprietà .

Aggiornare la pagina e selezionare il pulsante Aggiorna .

La finestra della console del browser visualizza ora una tabella che mostra i dati aggiornati.

Documento d'identità Nome
1 Molly

Creazione

Aggiungere il codice seguente tra i script tag in index.html.

async function create() {

  const data = {
    Name: "Pedro"
  };

  const endpoint = `/data-api/rest/Person/`;
  const response = await fetch(endpoint, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(data)
  });
  const result = await response.json();
  console.table(result.value);
}

In questo esempio:

  • L'endpoint ha il suffisso /person/.
  • Il verbo REST consiste POST nell'aggiungere un record di database.
  • I dati sono presenti nel payload della proprietà value della risposta.
async function create() {

  const data = {
    Name: "Pedro"
  };

  const gql = `
    mutation create($item: CreatePersonInput!) {
      createPerson(item: $item) {
        Id
        Name
      }
    }`;

  const query = {
    query: gql,
    variables: {
      item: data
    } 
  };

  const endpoint = "/data-api/graphql";
  const result = await fetch(endpoint, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(query)
  });

  const response = await result.json();
  console.table(response.data.createPerson);
}

In questo esempio:

  • La query GraphQL seleziona i campi Id e Name dal database.
  • L'oggetto query contiene la query GraphQL nella query proprietà .
  • I valori dell'argomento per la funzione GraphQL vengono passati tramite la query.variables proprietà .
  • La richiesta passata al server richiede un payload in cui la query proprietà contiene la definizione della query.
  • I dati nel payload di risposta si trovano nella data.updatePerson proprietà.

Aggiornare la pagina e selezionare il pulsante Crea .

La finestra della console del browser visualizza ora una tabella che mostra il nuovo record nel database.

Documento d'identità Nome
3 Pedro

Delete

Aggiungere il codice seguente tra i script tag in index.html.

async function del() {
  const id = 3;
  const endpoint = '/data-api/rest/Person/Id';
  const response = await fetch(`${endpoint}/${id}`, {
    method: "DELETE"
  });
  if(response.ok) {
    console.log(`Record deleted: ${ id }`)
  } else {
    console.log(response);
  }
}

In questo esempio:

  • L'endpoint ha il suffisso /person/Id/.
  • Il valore ID viene aggiunto alla fine della posizione dell'endpoint.
  • Il verbo REST consiste DELETE nel rimuovere il record del database.
  • Se l'eliminazione ha esito positivo, la proprietà payload ok della risposta è true.
async function del() {

  const id = 3;

  const gql = `
    mutation del($id: Int!) {
      deletePerson(Id: $id) {
        Id
      }
    }`;

  const query = {
    query: gql,
    variables: {
      id: id
    }
  };

  const endpoint = "/data-api/graphql";
  const response = await fetch(endpoint, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(query)
  });

  const result = await response.json();
  console.log(`Record deleted: ${ result.data.deletePerson.Id }`);
}

In questo esempio:

  • La query GraphQL seleziona il Id campo dal database.
  • L'oggetto query contiene la query GraphQL nella query proprietà .
  • I valori dell'argomento per la funzione GraphQL vengono passati tramite la query.variables proprietà .
  • La richiesta passata al server richiede un payload in cui la query proprietà contiene la definizione della query.
  • I dati del payload di risposta si trovano nella proprietà data.deletePerson.

Aggiornare la pagina e selezionare il pulsante Elimina .

La finestra della console del browser visualizza ora una tabella che mostra la risposta dalla richiesta di eliminazione.

Record eliminato: 3

Ora che si è lavorato con il sito in locale, è ora possibile distribuirlo in Azure.

Distribuire il tuo sito

Per distribuire questo sito nell'ambiente di produzione, è sufficiente eseguire il commit del file di configurazione ed eseguire il push delle modifiche nel server.

  1. Aggiungere le modifiche apportate al file per tenere traccia.

    git add .
    
  2. Applicare le modifiche di configurazione.

    git commit -am "Add database configuration"
    
  3. Effettuare il push delle modifiche al server.

    git push origin main
    

Connetti il database all'app web statica

Usare la procedura seguente per creare una connessione tra l'istanza di App Web statiche del sito e il database.

  1. Aprire l'app Web statica nel portale di Azure.

  2. Nella sezione Impostazioni selezionare Connessione database.

  3. Nella sezione Produzione selezionare il collegamento Collega database esistente .

  4. Nella finestra Collega database esistente immettere i valori seguenti:

    Proprietà Value
    Tipo di database Selezionare il tipo di database dall'elenco a discesa.
    Subscription Selezionare la sottoscrizione di Azure dall'elenco a discesa.
    Nome della risorsa Selezionare il nome del server di database con il database desiderato.
    Nome del database Selezionare il nome del database da collegare all'app Web statica.
    Tipo di autenticazione Selezionare Stringa di connessione e immettere il nome utente e la password mySQL.
  5. Seleziona OK.

Verificare che il database sia connesso alla risorsa App Web statiche

Dopo aver connesso il database all'app Web statica e aver completato la compilazione del sito, seguire questa procedura per verificare la connessione al database.

  1. Aprire l'app Web statica nel portale di Azure.

  2. Nella sezione Informazioni di base selezionare l'URL della risorsa App Web statiche per passare all'app Web statica.

  3. Selezionare il pulsante Elenco per elencare tutti gli elementi.

    L'output dovrebbe essere simile a quello mostrato in questo screenshot.

    Web browser che mostra i risultati dell'elenco dei record del database nella finestra della console degli strumenti di sviluppo.

Pulire le risorse

Per rimuovere le risorse create durante questa esercitazione, è necessario scollegare il database e rimuovere i dati di esempio.

  1. Scollega database: apri l'app Web statica nel portale di Azure. Nella sezione Impostazioni selezionare Connessione database. Accanto al database collegato selezionare Visualizza dettagli. Nella finestra Dettagli di connessione del database selezionare il pulsante Scollega.

  2. Rimuovere i dati di esempio: nel database eliminare la tabella denominata MyTestPersonTable.

Passaggi successivi