JavaRush /Blog Java /Random-FR /Nous ajoutons tout ce qui concerne la base de données. (P...
Roman Beekeeper
Niveau 35

Nous ajoutons tout ce qui concerne la base de données. (Partie 1) - "Projet Java de A à Z"

Publié dans le groupe Random-FR
Pas à pas, nous avançons vers notre objectif. "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 - 1Aujourd'hui, nous devons résoudre de nombreuses tâches :
  1. Ajouter une voie de migration. Ici, nous allons configurer le déploiement de la base de données pour le projet.
  2. Ajoutez un schéma de base de données.
  3. Ajoutez une couche de référentiel.
  4. Ajoutez une commande pour les statistiques du bot.
  5. Écrivez des tests, après tout.
Alors asseyez-vous, asseyez-vous, la lecture sera longue. Nous avons déjà appris comment déployer notre application à l'aide de docker et docker-compose. Cela n’a pas été facile et félicitations à ceux qui ont réussi. Si vous avez des questions sur l'implémentation, vous pouvez consulter le code dans cette pull request .

Ajout d'une voie de migration

Pour ajouter Flyway, vous devez disposer d'une base de données, que nous ajouterons comme autre service dans docker-compose. La dernière fois , j'ai dit que docker-compose avait une section de services, qui est précisément responsable de l'ajout et de la gestion d'une certaine infrastructure - c'est-à-dire un ensemble d'applications/bases de données/messagers, etc.
J'ai déjà parlé de ce qu'est Flyway et de comment l'ajouter à une application SpringBoot . Je vous conseille de vous rafraîchir la mémoire avant de lire cet article. Vous pouvez également lire le fichier README.md du projet avec une démonstration de l'article sur Flyway + SpringBoot.
La première chose que nous faisons est de mettre à jour notre branche principale dans le projet (git pull) et d'en créer une nouvelle avec le nom de notre tâche - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Je vous le rappelle : nous avons renommé les branches afin qu'il soit possible de trier l'enchaînement des tâches dans le projet uniquement par nom. Cela vous permettra de passer rapidement d’une étape à l’autre. Vous pouvez désormais travailler en toute tranquillité. Nous devons ajouter trois dépendances :
<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 première dépendance est chargée d'ajouter FlyWay au projet, la seconde ajoute la possibilité de se connecter à la base de données MySQL. Le troisième est SpringBoot starter, qui lance toute la magie de l'utilisation d'une base de données au Spring. Et ajoutons également un lombok pour ne pas écrire de getters et de setters :
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
Nous avons maintenant besoin d'une base de données pour le développement. Nous allons le créer pour l'instant ( jusqu'à ce que je trouve une meilleure idée ) en tant que fichier docker-compose distinct et en tant que fichier distinct pour application.properties. Il existe dans le développement (et dans l'écosystème Spring en particulier) des profils. Selon le profil, différents paramètres sont lancés pour le fonctionnement. Je pense qu'à l'avenir, nous combinerons docker-compose en un seul fichier et veillerons à ce qu'une seule base de données soit lancée pour le développement sur les paramètres dont nous avons besoin. Pour l'instant, nous allons faire ceci :
  1. Créons un fichier à la racine du projet docker-compose-test.yml, dans lequel seule la base de données avec ses propres paramètres sera lancée.
  2. Créons un fichier application-test.properties avec des paramètres qui correspondent aux paramètres du fichier docker-compose-test.yml.
Pour travailler avec MySQL, j'ai pris l'image officielle de DockerHub : "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 - 2Après avoir fait défiler rapidement, j'ai trouvé les variables nécessaires : MYSQL_DATABASE - nom de la base de données MYSQL_USER - nom d'utilisateur de la base de données MYSQL_PASSWORD - mot de passe de l'utilisateur de la base de données Et comment elles doivent être écrites correctement :
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
Après cela, je crée docker-compose-test.yml à la racine du projet :
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
Pour exécuter ce fichier particulier afin qu'il fonctionne avec docker-compose, vous devez utiliser l' indicateur -f dans la requête . Cela signifie que le nom du fichier lancé sera fourni, plutôt que le standard docker-compose.yml utilisé. Par conséquent, la requête ressemblera à ceci : docker-compose -f docker-compose-test.yml up -d Il s'avère que nous disons d'abord quel fichier prendre ( -f docker-compose-test.yml ), puis nous disons que nous devons augmenter les services et le faire en mode démon ( up -d ) - c'est-à-dire pour que le processus s'exécute en dehors de la session de terminal dans laquelle cette commande a été lancée. Nous lançons et essayons de nous connecter à la base de données pour nous assurer qu'elle est opérationnelle et peut être utilisée. Pour ce faire, ouvrez le MySQL Workbench familier ( nous en avons parlé ici ) et créez une nouvelle connexion : "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 à 3Nous devons remplir les champs suivants :
  • Nom de la connexion - nom de la connexion - éventuellement, DEV_JRTB_DB ;
  • Nom d'hôte - voici l'adresse où la base de données est déployée. Dans notre cas, tout restera tel qu'il était : 127.0.0.1 , ou localhost ;
  • nom d'utilisateur - ici sera root, comme nous l'avons écrit dans docker-compose ;
  • mot de passe - également root.
Après cela, vous devez vérifier s'il existe une connexion. Pour ce faire, cliquez sur Test de connexion : "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 à 4Le résultat est : Échec de la connexion à MySQL... Pourquoi ? Nous allons au terminal et voyons ce qui est arrivé au conteneur Docker. Écrivons dans le terminal : "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 à 5On voit que le terminal a été créé il y a 59 minutes, et le redémarrage a duré 55 secondes... pourquoi ? Ce n'est pas clair, il faut regarder les logs. Accédez à la racine du projet dans le terminal et exécutez la commande suivante : docker-compose -f docker-compose-test.yml logs
On a:

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

Il est désormais clair que la base de données n'a jamais démarré avec nos paramètres. L’erreur est la même, alors isolons-la de la feuille :
2021-02-28 11:03:37+00:00 [ERREUR] [Point d'entrée] : la base de données n'est pas initialisée et l'option de mot de passe n'est pas spécifiée dev-jrtb-db | Vous devez spécifier l'un des MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD et MYSQL_RANDOM_ROOT_PASSWORD.
Autrement dit, il doit déterminer le mot de passe de l'utilisateur root - l'utilisateur principal. Bon, maintenant nous allons mettre à jour notre fichier :
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
Nous avons supprimé ces variables pour l'utilisateur et le mot de passe et ajouté uniquement le mot de passe de l'utilisateur root. Cela signifie que l'utilisateur root aura désormais un mot de passe root. C'est du moins ce que nous supposons. Maintenant, exécutons-le et voyons ce qui se passe : docker-compose -f docker-compose-test.yml up -d Et voyons immédiatement ce que les journaux nous disent : docker-compose -f docker-compose-test.yml logs
Regardons:

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.

Il ne semble y avoir plus d'erreurs, vous pouvez donc voir s'il y aura accès. Mais malheureusement, il n'y a plus d'accès... Rien : nous y reviendrons plus loin ! "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 à 6Pour terminer docker-compose et supprimer tous les conteneurs, vous devez écrire : docker-compose -f docker-compose-test.yml down Ici, nous avons spécifié le fichier à supprimer. Ce qu'il faut faire? Cherchons-le sur Google : peut-être que quelqu'un l'a fait mieux. La requête la plus simple : « exemple de mysql dans docker-compose » nous aide à trouver un lien vers une ressource médium. Ils donnent cet exemple :
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:
Nous l'adaptons à nos besoins et obtenons :
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'
On lance cette option avec la commande que nous connaissons déjà : docker-compose -f docker-compose-test.yml up -d On essaie à nouveau d'accéder à la base de données via MySQLWorkBench : "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 à 7Enfin, l'accès est apparu. Mais maintenant, je me demande ce qui a influencé cela. Je pèche sur cette partie :
expose:
   # Opens port 3306 on the container
   - '3306'
C'est simple à vérifier : sans cela, rien ne devrait fonctionner :D. Vérifions : supprimons cette partie, redémarrez docker-compose : docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up Nous essayons de nous connecter à la base de données via workbench : tout est bien. Ensuite, la seule option est la version de la base de données. Il indique clairement 5.7, c'est-à-dire que si vous le modifiez vers la dernière version, cela ne devrait pas fonctionner. Je l'ai redémarré - et ça ne marche vraiment pas... "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 à 8Apparemment, ils ont quelques problèmes avec l'image docker sur la dernière version. D'accord pas de problème. Cela arrive souvent avec les logiciels libres. Nous utiliserons la version 5.7. Voyons si nous avons besoin d'une base de données - dev_jrtb_db. Pour ce faire, exécutez la commande Query dans MySQL Workbench SHOW DATABASES : "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 à 9Oui, elle est présente dans la sortie. Super, nous pouvons passer à autre chose. Ensuite, ajoutons notre première migration. Sur la base des tâches de l'article « Planification de projet : mesurer deux fois, couper une fois », nous allons créer notre premier tableau tg_user. Toutes les migrations seront situées dans le dossier projectDir/src/main/resources/db/migration et le nom sera : V00001__add_tg_user_table.sql . Pourquoi il y a un tel nom dans ce dossier - je l'ai décrit dans l'article sur Spring + flyway. Voici à quoi ressemblera notre première migration : 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
);
Autrement dit, nous créons ici simplement un tableau d'un utilisateur qui n'a qu'un identifiant de chat (un élément unique qui peut être utilisé pour fonctionner comme un identifiant dans le tableau) et son état - actif ou inactif. Ainsi, si le bot est arrêté, les informations d’abonnement resteront et pourront être utilisées s’ils souhaitent réutiliser le bot. Aucune autre information sur l'utilisateur n'est nécessaire pour l'instant. Maintenant la question principale : comment vérifier cela ? Nous devons lancer notre application. Jusqu'à présent, le fichier principal docker-compose.yml n'a aucun lien avec la base de données, et nous devons également apprendre à déboguer l'application avec la base de données. Par conséquent, lançons l'application avec Intellij IDEA. Pour tester cela, nous devrons exécuter notre méthode principale dans JavarushTelegramBotApplication. Pour séparer le travail de déploiement et de test, nous utiliserons un autre fichier avec des propriétés - application-test.properties . Avec ce modèle, nous informons Spring que ce fichier sera utilisé pour le profil de test . Lorsque nous ne spécifions pas de profil, le profil par défaut est utilisé (vérifiez cela dans vos logs lors de l'exécution de SpringBoot : cela sera écrit à ce sujet dans les premières lignes). Voici à quoi cela ressemblera :
# 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
Et le fichier application.properties principal sera légèrement différent :
# 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 différence significative se situe dans le champ spring.datasource.url : dans le profil de test nous avons une URL sur localhost . Autrement dit, l'application est censée s'exécuter en dehors de Docker, ce qui est vrai, car lors du débogage, nous exécuterons notre projet dans Intellij IDEA et nous nous attendons à ce que nous ayons accès à la base de données à partir de la machine locale. Mais l'URL application.properties en contient déjà une autre - jrtb-db . Ce sera le nom de notre base de données dans docker-compose, et ainsi notre application docker pourra accéder à la base de données. Pourquoi? Par conséquent, ils se lanceront dans le même docker-compose et se connaîtront de cette manière. Cela est nécessaire pour que nous ayons une infrastructure fermée pour le projet. Mais comment lancer le profil au démarrage ? Pour cela, vous pouvez configurer le lancement de la méthode main dans Intellij IDEA. Pour cela, il y a Edit Configurations : allez dans la classe principale de JavarushTelegramBotApplication, cliquez sur la flèche verte à côté de la déclaration de la méthode principale et sélectionnez Modify Run Configuration : "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 à 10Saisissez les variables nécessaires et configurez le profil. Dans Intellij IDEA, l'interface de cette fenêtre de configuration a légèrement changé, je conseille donc à tout le monde de mettre à jour IDEA vers la dernière version afin que nous voyions la même image : "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 - 11Dans le champ Variables d'environnement , nous devons ajouter le nom du bot et les variables de jeton en utilisant le modèle suivant : variable_name1=value1 ; variable_name2=value2 . Autrement dit, clé=valeur sont séparés par des points-virgules. Dans notre cas, ce sera comme ceci : bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (vous aurez un nom et un token différents pour le bot) Ensuite, sélectionnez le champ Ajouter des options de VM dans le bouton Modifier les options : Écrire : -Dspring.profiles.active =test - cela indiquera à SpringBoot d'utiliser le profil de test, ce qui signifie que les propriétés seront extraites de application-test.properties. En conséquence, cela ressemblera à ceci : Nous lançons maintenant notre base de données de test : docker-compose -f docker-compose-test.yml up Et exactement de cette façon, sans le préfixe -d, afin que les logs soient immédiatement visibles dans le terminal, le cas échéant. Et la dernière étape consiste simplement à exécuter la méthode principale. Si vous faites tout de la même manière que je l'ai décrit, vous obtiendrez : La deuxième ligne des journaux sera une description de ce que le profil de test a gagné. Nous passons par MySQLWorkbench et exécutons deux commandes pour vérifier que la migration a été déployée et que tout fonctionne (bien que cela soit visible dans les journaux de lancement de l'application, cela vaut vraiment la peine de vérifier) :"Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 à 12"Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 - 13"Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 - 14
  1. utilisez dev_jrtb_db ;
  2. afficher les tableaux ;
Résultat : "Projet Java de A à Z" : Ajout de tout ce qui concerne la base de données.  Partie 1 - 15Comme prévu, nous avons obtenu deux tables. Le premier est technique pour comptabiliser les migrations, le second est notre tableau pour les utilisateurs de Telegram. Tous : La voie de migration ainsi que la base de données ont été ajoutées. Désormais, les nouvelles migrations se dérouleront comme sur des roulettes. Le plus difficile est la première configuration et le lancement du processus. Dans la continuité , nous terminons les travaux sur cette tâche globale : ajout de bases de données à docker-compose.yml, ajout d'une couche Repository, statistiques pour le bot, rédaction et mise à jour des tests et de la documentation.

Une liste de tous les matériaux de la série se trouve au début de cet article.

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