JavaRush /Java Blog /Random-IT /Aggiungiamo tutto ciò che riguarda il database. (Parte 1)...
Roman Beekeeper
Livello 35

Aggiungiamo tutto ciò che riguarda il database. (Parte 1) - "Progetto Java dalla A alla Z"

Pubblicato nel gruppo Random-IT
Passo dopo passo ci stiamo muovendo verso il nostro obiettivo. "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 1Oggi dobbiamo risolvere molti compiti:
  1. Aggiungi Flyway. Qui configureremo la distribuzione del database per il progetto.
  2. Aggiungi uno schema di database.
  3. Aggiungi un livello di repository.
  4. Aggiungi un comando per le statistiche del bot.
  5. Dopotutto, scrivi i test.
Quindi sedetevi, sedetevi, ci sarà una lunga lettura. Abbiamo già imparato come distribuire la nostra applicazione utilizzando docker e docker-compose. Non è stato facile, e complimenti a chi è riuscito a farcela. Se hai domande sull'implementazione, puoi guardare il codice in questa richiesta pull .

Aggiunta di Flyway

Per aggiungere Flyway, devi disporre di un database, che aggiungeremo come un altro servizio in docker-compose. L'ultima volta ho detto che docker-compose ha una sezione servizi, che è proprio responsabile dell'aggiunta e della gestione di una determinata infrastruttura, ovvero un insieme di applicazioni/database/messenger, ecc.
Ho già parlato di cos'è Flyway e di come aggiungerlo a un'applicazione SpringBoot . Ti consiglio di rinfrescarti la memoria prima di leggere questo articolo. Puoi anche leggere il file README.md del progetto con una dimostrazione dell'articolo su Flyway + SpringBoot.
La prima cosa che facciamo è aggiornare il nostro ramo principale nel progetto (git pull) e crearne uno nuovo con il nome della nostra attività: STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Lascia che te lo ricordi: abbiamo rinominato i rami in modo che fosse possibile ordinare la sequenza delle attività nel progetto solo per nome. Ciò ti consentirà di passare rapidamente da un passaggio all'altro. Adesso puoi lavorare in tutta tranquillità. Dobbiamo aggiungere tre dipendenze:
<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
La prima dipendenza è responsabile dell'aggiunta di FlyWay al progetto, la seconda aggiunge la possibilità di connettersi al database MySQL. Il terzo è SpringBoot Starter, che lancia tutta la magia dell'utilizzo di un database in primavera. E aggiungiamo anche un lombok per non scrivere getter e setter:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
Ora abbiamo bisogno di un database per lo sviluppo. Per ora lo creeremo ( finché non avrò un'idea migliore ) come file docker-compose separato e file separato per application.properties. Esistono cose in fase di sviluppo (e in particolare nell'ecosistema Spring) come i profili. A seconda del profilo, vengono avviate diverse impostazioni per il funzionamento. Penso che in futuro combineremo docker-compose in un unico file e ci assicureremo che venga avviato un solo database per lo sviluppo sulle impostazioni di cui abbiamo bisogno. Per ora faremo così:
  1. Creiamo un file nella root del progetto docker-compose-test.yml, nel quale verrà lanciato solo il database con le proprie impostazioni.
  2. Creiamo un file application-test.properties con impostazioni che corrispondono alle impostazioni nel file docker-compose-test.yml.
Per lavorare con MySQL, ho preso l'immagine ufficiale da DockerHub : "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 2Dopo averla sfogliata rapidamente, ho trovato le variabili necessarie: MYSQL_DATABASE - nome del database MYSQL_USER - nome utente del database MYSQL_PASSWORD - password dell'utente del database E come devono essere scritte correttamente:
jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
Successivamente, creo docker-compose-test.yml nella root del progetto:
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
Per eseguire questo particolare file in modo che funzioni con docker-compose, è necessario utilizzare il flag -f nella request . Ciò significa che verrà fornito il nome del file avviato, anziché il file docker-compose.yml standard. Pertanto, la richiesta sarà simile a questa: docker-compose -f docker-compose-test.yml up -d Risulta che prima diciamo quale file prendere ( -f docker-compose-test.yml ), e poi noi diciamo che dobbiamo attivare i servizi e farlo in modalità demone ( up -d ), ovvero in modo che il processo venga eseguito all'esterno della sessione terminale in cui è stato avviato questo comando. Lanciamo e proviamo a connetterci al database per assicurarci che sia attivo e possa essere utilizzato. Per fare ciò, apri il familiare MySQL Workbench ( qui ne abbiamo parlato ) e crea una nuova connessione: "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 3dobbiamo compilare i seguenti campi:
  • Nome connessione - nome connessione - facoltativamente, DEV_JRTB_DB;
  • Nome host: ecco l'indirizzo in cui viene distribuito il database. Nel nostro caso tutto rimarrà com'era: 127.0.0.1 , ovvero localhost;
  • nomeutente: qui sarà root, come abbiamo scritto in docker-compose;
  • password - anche root.
Successivamente, è necessario verificare se c'è una connessione. Per fare ciò, fai clic su Test connessione : "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 4Di conseguenza, otteniamo: Impossibile connettersi a MySQL... Perché? Andiamo al terminale e vediamo cosa è successo al container docker. Scriviamo nel terminale: "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 5Vediamo che il terminale è stato creato 59 minuti fa e il riavvio è durato 55 secondi... perché? Non è chiaro, devi guardare i log. Vai alla root del progetto nel terminale ed esegui il seguente comando: docker-compose -f docker-compose-test.yml logs
Noi abbiamo:

dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

Ora è chiaro che il database non è mai iniziato con le nostre impostazioni. L'errore è lo stesso, isoliamolo dal foglio:
28-02-2021 11:03:37+00:00 [ERRORE] [punto di ingresso]: il database non è inizializzato e l'opzione password non è specificata dev-jrtb-db | È necessario specificare uno tra MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD e MYSQL_RANDOM_ROOT_PASSWORD
Cioè, deve determinare la password per l'utente root, l'utente principale. Ok, ora aggiorneremo il nostro file:
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_ROOT_PASSWORD: root
Abbiamo rimosso quelle variabili per utente e password e aggiunto solo la password per l'utente root. Ciò significa che l'utente root avrà ora una password root. Almeno questo è quello che supponiamo. Ora eseguiamolo e vediamo cosa succede: docker-compose -f docker-compose-test.yml up -d E vediamo subito cosa ci dicono i log: docker-compose -f docker-compose-test.yml logs
Guardiamo:

Attaching to dev-jrtb-db dev-jrtb-db | 2021-02-28 11:20:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Initializing database files dev-jrtb-db | 2021-02-28T11:20:41.083803Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.23) initializing of server in progress as process 43 dev-jrtb-db | 2021-02-28T11:20:41.088457Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:41.447990Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:42.672093Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Database files initialized dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Starting temporary server dev-jrtb-db | 2021-02-28T11:20:45.893664Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 88 dev-jrtb-db | 2021-02-28T11:20:45.921695Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:46.088339Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:46.207499Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:46.369170Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:46.369357Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:46.371501Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:46.402227Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:46+00:00 [Note] [Entrypoint]: Temporary server started. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Creating database dev_jrtb_db dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Stopping temporary server dev-jrtb-db | 2021-02-28T11:20:49.187996Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.23). dev-jrtb-db | 2021-02-28T11:20:50.925075Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.23) MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: Temporary server stopped dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. dev-jrtb-db | dev-jrtb-db | 2021-02-28T11:20:51.420058Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 1 dev-jrtb-db | 2021-02-28T11:20:51.427384Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:51.577244Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:51.677659Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:51.787156Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:51.787325Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:51.789742Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:51.812100Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.

Sembra che non ci siano più errori, quindi puoi vedere se ci sarà accesso. Ma purtroppo non c’è più accesso… Niente: troveremo una soluzione più approfondita! "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 6Per terminare docker-compose ed eliminare tutti i contenitori, è necessario scrivere: docker-compose -f docker-compose-test.yml down Qui abbiamo specificato il file da eliminare. Cosa fare? Cerchiamo su Google: forse qualcuno ha fatto meglio. La query più semplice: "esempio di mysql in docker-compose" ci aiuta a trovare un collegamento a una risorsa media. Fanno questo esempio:
version: '3.3'
services:
 db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'password'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
     # Opens port 3306 on the container
     - '3306'
     # Where our data will be persisted
   volumes:
     - my-db:/var/lib/mysql
# Names our volume
volumes:
 my-db:
Lo adattiamo alle nostre esigenze e otteniamo:
version: '3.1'

services:
 jrtb-db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'dev_jrtb_db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'dev_jrtb_db_user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'dev_jrtb_db_password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'root'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
       # Opens port 3306 on the container
       - '3306'
Lanciamo questa opzione con il comando a noi già noto: docker-compose -f docker-compose-test.yml up -d Proviamo nuovamente ad accedere al database tramite MySQLWorkBench: "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 7finalmente è apparso l'accesso. Ma ora mi chiedo cosa abbia influenzato tutto ciò. Sto peccando da questo lato:
expose:
   # Opens port 3306 on the container
   - '3306'
È facile verificarlo: senza questo non dovrebbe funzionare nulla :D. Controlliamo: cancella questa parte, riavvia docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up Proviamo ad accedere al database tramite workbench: tutto è Bene. Quindi l'unica opzione è la versione del database. Dice chiaramente 5.7, cioè se lo cambi con l'ultimo, non dovrebbe funzionare. L'ho riavviato e non funziona davvero... "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 8A quanto pare hanno dei problemi con l'immagine docker nell'ultima versione. Ok nessun problema. Questo accade spesso con il software gratuito. Utilizzeremo la versione 5.7. Vediamo se c'è un database di cui abbiamo bisogno: dev_jrtb_db. Per fare ciò, esegui il comando Query in MySQL Workbench SHOW DATABASES : "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 9Sì, è presente nell'output. Ottimo, possiamo andare avanti. Successivamente, aggiungiamo la nostra prima migrazione. Sulla base dei compiti dell'articolo "Pianificazione del progetto: misurare due volte, tagliare una volta", creeremo la nostra prima tabella tg_user. Tutte le migrazioni si troveranno nella cartella projectDir/src/main/resources/db/migration e il nome sarà: V00001__add_tg_user_table.sql . Perché c'è un nome simile in quella cartella? L'ho descritto nell'articolo su Spring + Flyway. Ecco come apparirà la nostra prima migrazione: V00001__add_tg_user_table.sql:
-- ensure that the table with this name is removed before creating a new one.
DROP TABLE IF EXISTS tg_user;

-- Create tg_user table
CREATE TABLE tg_user (
   chat_id VARCHAR(100),
   active BOOLEAN
);
Cioè, qui creiamo semplicemente una tabella di un utente che ha solo un ID chat (un elemento univoco che può essere utilizzato per funzionare come ID nella tabella) e il suo stato: attivo o inattivo. Pertanto, se il bot viene arrestato, le informazioni sull'abbonamento rimarranno e potranno essere utilizzate se si desidera utilizzare nuovamente il bot. Per il momento non sono necessarie altre informazioni sull'utente. Ora la domanda principale: come verificarlo? Dobbiamo avviare la nostra applicazione. Finora, il file docker-compose.yml principale non ha alcuna connessione con il database e dobbiamo anche imparare come eseguire il debug dell'applicazione insieme al database. Lanciamo quindi l'applicazione con Intellij IDEA. Per testarlo dovremo eseguire il nostro metodo principale in JavarushTelegramBotApplication. Per separare il lavoro di distribuzione e test, utilizzeremo un altro file con proprietà: application-test.properties . Con questo modello comunichiamo a Spring che questo file verrà utilizzato per il profilo di test . Quando non specifichiamo un profilo, viene utilizzato il profilo predefinito (controllalo nei tuoi log quando esegui SpringBoot: verrà scritto a riguardo nelle prime righe). Ecco come apparirà:
# MySQL configurations:
spring.datasource.url=jdbc:mysql://localhost:3306/dev_jrtb_db
spring.datasource.username=dev_jrtb_db_user
spring.datasource.password=dev_jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=tes
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
E le application.properties principali avranno un aspetto leggermente diverso:
# MySQL configurations:
spring.datasource.url=jdbc:mysql://jrtb-db:3306/jrtb_db
spring.datasource.username=jrtb_db_user
spring.datasource.password=jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=test.javarush_community_bot
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
La differenza significativa sta nel campo spring.datasource.url: nel profilo di test abbiamo un URL su localhost . Cioè, si prevede che l'applicazione venga eseguita al di fuori di Docker, il che è vero, perché durante il debug eseguiremo il nostro progetto in Intellij IDEA e ci aspettiamo di avere accesso al database dal computer locale. Ma l'URL application.properties ne contiene già uno diverso: jrtb-db . Questo sarà il nome del nostro database in docker-compose e in questo modo la nostra applicazione docker potrà raggiungere il database. Perché? Pertanto, verranno avviati all'interno della stessa finestra mobile e si conosceranno l'un l'altro in questo modo. Ciò è necessario affinché disponiamo di un'infrastruttura chiusa per il progetto. Ma come lanciare il profilo all'avvio? Per fare ciò, puoi configurare l'avvio del metodo principale in Intellij IDEA. Per questo c'è Modifica configurazioni : vai alla classe principale di JavarushTelegramBotApplication, fai clic sulla freccia verde accanto alla dichiarazione del metodo principale e seleziona Modifica configurazione esecuzione : "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 10inserisci le variabili necessarie e configura il profilo. In Intellij IDEA, l'interfaccia di questa finestra di configurazione è leggermente cambiata, quindi consiglio a tutti di aggiornare IDEA all'ultima versione in modo da vedere la stessa immagine: "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 11nel campo Variabili di ambiente , dobbiamo aggiungere il nome del bot e le variabili del token utilizzando il seguente modello: nome_variabile1=valore1; nome_variabile2=valore2 . Cioè, chiave=valore sono separati da punto e virgola. Nel nostro caso sarà così: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (avrai un nome e un token diversi per il bot) Successivamente, seleziona il campo Aggiungi opzioni VM nel pulsante Modifica opzioni : Scrivi : -Dspring.profiles.active =test - questo dirà a SpringBoot di utilizzare il profilo di test, il che significa che le proprietà verranno prese da application-test.properties. Di conseguenza, sarà simile a questo: Ora lanciamo il nostro database di test: docker-compose -f docker-compose-test.yml up Ed esattamente in questo modo, senza il prefisso -d, in modo che i log possano essere immediatamente visualizzati in il terminale, se necessario. E l'ultimo passaggio è semplicemente eseguire il metodo principale. Se fai tutto nello stesso modo che ho descritto, ti ritroverai con: La seconda riga dei log sarà una descrizione di ciò che ha guadagnato il profilo di test. Eseguiamo MySQLWorkbench ed eseguiamo due comandi per verificare che la migrazione sia stata eseguita e che tutto funzioni (anche se questo è visibile dai registri di avvio dell'applicazione, vale sicuramente la pena controllarlo):"Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 12"Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 13"Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 14
  1. usa dev_jrtb_db;
  2. mostrare tabelle;
Risultato: "Progetto Java dalla A alla Z": aggiunta di tutto ciò che riguarda il database.  Parte 1 - 15come previsto, abbiamo ottenuto due tavoli. Il primo è tecnico per la contabilità delle migrazioni, il secondo è la nostra tabella per gli utenti di Telegram. Tutto: è stato aggiunto Flyway insieme al database. Ora le nuove migrazioni andranno come un orologio. La cosa più difficile è la prima configurazione e l'avvio del processo. Di seguito , stiamo completando il lavoro su questo compito globale: aggiunta di database a docker-compose.yml, aggiunta di un livello di repository, statistiche per il bot, scrittura e aggiornamento di test e documentazione.

Un elenco di tutti i materiali della serie si trova all'inizio di questo articolo.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION