JavaRush /Blog Java /Random-ES /Agregamos todo lo relacionado con la base de datos. (Part...

Agregamos todo lo relacionado con la base de datos. (Parte 1) - "Proyecto Java de la A a la Z"

Publicado en el grupo Random-ES
Paso a paso vamos avanzando hacia nuestro objetivo. "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 1Hoy necesitamos resolver muchas tareas:
  1. Agregar ruta migratoria. Aquí configuraremos la implementación de la base de datos para el proyecto.
  2. Agregue un esquema de base de datos.
  3. Agregue una capa de repositorio.
  4. Agregue un comando para las estadísticas del bot.
  5. Después de todo, escribe pruebas.
Así que siéntate, siéntate, habrá una lectura larga. Ya hemos aprendido cómo implementar nuestra aplicación usando Docker y Docker-Compose. No fue fácil y felicidades a quienes lograron hacerlo. Si tiene alguna pregunta sobre la implementación, puede consultar el código en esta solicitud de extracción .

Agregar ruta migratoria

Para agregar Flyway, necesita tener una base de datos, que agregaremos como otro servicio en Docker-Compose. La última vez dije que docker-compose tiene una sección de servicios, que es precisamente responsable de agregar y administrar una determinada infraestructura, es decir, un conjunto de aplicaciones/bases de datos/mensajería, etc.
Ya he hablado de qué es Flyway y cómo agregarlo a una aplicación SpringBoot . Te aconsejo que refresques la memoria antes de leer este artículo. También puede leer el archivo del proyecto README.md con una demostración de un artículo sobre Flyway + SpringBoot.
Lo primero que hacemos es actualizar nuestra rama principal en el proyecto (git pull) y crear una nueva con el nombre de nuestra tarea: STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Permítanme recordarles: cambiamos el nombre de las ramas para que fuera posible ordenar la secuencia de tareas en el proyecto solo por nombre. Esto le permitirá pasar rápidamente de un paso a otro. Ahora puedes trabajar en paz. Necesitamos agregar tres dependencias:
<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 primera dependencia es responsable de agregar FlyWay al proyecto, la segunda agrega la capacidad de conectarse a la base de datos MySQL. El tercero es el iniciador SpringBoot, que lanza toda la magia del uso de una base de datos en Spring. Y también agreguemos un lombok para no escribir captadores y definidores:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
Ahora necesitamos una base de datos para el desarrollo. Lo crearemos por ahora ( hasta que se me ocurra una idea mejor ) como un archivo Docker-Compose separado y un archivo separado para application.properties. Existe algo en el desarrollo (y en el ecosistema Spring en particular) llamado perfiles. Dependiendo del perfil, se inician diferentes configuraciones para su funcionamiento. Creo que en el futuro combinaremos docker-compose en un solo archivo y nos aseguraremos de que solo se inicie una base de datos para el desarrollo con la configuración que necesitamos. Por ahora haremos esto:
  1. Creemos un archivo en la raíz del proyecto docker-compose-test.yml, en el que solo se iniciará la base de datos con su propia configuración.
  2. Creemos un archivo application-test.properties con configuraciones que coincidan con las configuraciones en el archivo docker-compose-test.yml.
Para trabajar con MySQL, tomé la imagen oficial de DockerHub : "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 2después de desplazarme rápidamente, encontré las variables necesarias: MYSQL_DATABASE - nombre de la base de datos MYSQL_USER - nombre de usuario de la base de datos MYSQL_PASSWORD - contraseña del usuario de la base de datos Y cómo deben escribirse correctamente:
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
Después de eso, creo docker-compose-test.yml en la raíz del proyecto:
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
Para ejecutar este archivo en particular para que funcione con docker-compose, debe usar el indicador -f en la solicitud . Significa que se proporcionará el nombre del archivo que se inicia, en lugar de tomar el docker-compose.yml estándar. Por lo tanto, la solicitud se verá así: docker-compose -f docker-compose-test.yml up -d Resulta que primero decimos qué archivo tomar ( -f docker-compose-test.yml ), y luego Digamos que necesitamos activar servicios y hacerlo en modo demonio ( up -d ), es decir, para que el proceso se ejecute fuera de la sesión de terminal en la que se lanzó este comando. Iniciamos e intentamos conectarnos a la base de datos para asegurarnos de que esté activa y se pueda utilizar. Para hacer esto, abra el conocido MySQL Workbench ( hablamos de ello aquí ) y cree una nueva conexión: "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 3Necesitamos completar los siguientes campos:
  • Nombre de la conexión - nombre de la conexión - opcionalmente, DEV_JRTB_DB;
  • Nombre de host: aquí está la dirección donde está implementada la base de datos. En nuestro caso todo quedará como estaba: 127.0.0.1 , o localhost;
  • nombre de usuario: aquí será root, como hemos escrito en docker-compose;
  • contraseña - también root.
Después de esto, debes verificar si hay una conexión. Para hacer esto, haga clic en Probar conexión : "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 4Como resultado, obtenemos: No se pudo conectar a MySQL... ¿Por qué? Vamos a la terminal y vemos qué pasó con el contenedor acoplable. Escribamos en la terminal: "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 5Vemos que la terminal fue creada hace 59 minutos, y el reinicio fue de 55 segundos… ¿por qué? No está claro, hay que mirar los registros. Vaya a la raíz del proyecto en la terminal y ejecute el siguiente comando: docker-compose -f docker-compose-test.yml logs
Obtenemos:

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

Ahora está claro que la base de datos nunca se inició con nuestra configuración. El error es el mismo, así que aislémoslo de la hoja:
2021-02-28 11:03:37+00:00 [ERROR] [Punto de entrada]: la base de datos no está inicializada y la opción de contraseña no está especificada dev-jrtb-db | Debe especificar una de MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD y MYSQL_RANDOM_ROOT_PASSWORD
Es decir, necesita determinar la contraseña del usuario root, el usuario principal. Bien, ahora actualizaremos nuestro archivo:
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
Eliminamos esas variables para el usuario y la contraseña y agregamos solo la contraseña para el usuario root. Esto significa que el usuario root ahora tendrá una contraseña de root. Al menos eso es lo que suponemos. Ahora ejecútelo y veamos qué sucede: docker-compose -f docker-compose-test.yml up -d E inmediatamente veamos lo que nos dicen los registros: docker-compose -f docker-compose-test.yml logs
Miremos:

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.

Parece que ya no hay errores, así que puedes ver si habrá acceso. Pero, lamentablemente, ya no hay acceso... Nada: ¡lo resolveremos más a fondo! "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 6Para finalizar docker-compose y eliminar todos los contenedores, debe escribir: docker-compose -f docker-compose-test.yml down Aquí especificamos el archivo que se eliminará. ¿Qué hacer? Busquémoslo en Google: quizás alguien lo haya hecho mejor. La consulta más simple: "ejemplo de mysql en docker-compose" nos ayuda a encontrar un enlace a un recurso mediano. Dan este ejemplo:
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 adaptamos a nuestras necesidades y conseguimos:
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'
Lanzamos esta opción con el comando que ya conocemos: docker-compose -f docker-compose-test.yml up -d Intentamos nuevamente acceder a la base de datos a través de MySQLWorkBench: "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 7Finalmente ha aparecido el acceso. Pero ahora me pregunto qué influyó en esto. Estoy pecando en esta parte:
expose:
   # Opens port 3306 on the container
   - '3306'
Es fácil de comprobar: sin esto, nada debería funcionar :D. Comprobemos: elimine esta parte, reinicie docker-compose: docker-compose -f docker-compose-test.yml abajo docker-compose -f docker-compose-test.yml arriba Intentamos iniciar sesión en la base de datos a través del banco de trabajo: todo está bien. Entonces la única opción es la versión de la base de datos. Pone claramente 5.7, es decir, si lo cambias a la última no debería funcionar. Lo reinicié y realmente no funciona... "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 8Aparentemente, tienen algunos problemas con la imagen de la ventana acoplable en la última versión. Está bien, no hay problema. Esto sucede a menudo con el software libre. Usaremos la versión 5.7. Veamos si hay una base de datos que necesitemos: dev_jrtb_db. Para hacer esto, ejecute el comando Consulta en MySQL Workbench MOSTRAR BASES DE DATOS : "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 9Sí, está presente en la salida. Genial, podemos seguir adelante. A continuación, agreguemos nuestra primera migración. Basándonos en las tareas del artículo "Planificación de proyectos: medir dos veces, cortar una vez", crearemos nuestra primera tabla tg_user. Todas las migraciones se ubicarán en la carpeta projectDir/src/main/resources/db/migration y el nombre será: V00001__add_tg_user_table.sql . ¿Por qué hay ese nombre en esa carpeta? Lo describí en el artículo sobre Spring + Flyway. Así es como se verá nuestra primera migración: 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
);
Es decir, aquí simplemente creamos una tabla de un usuario que solo tiene una ID de chat (un elemento único que puede usarse para funcionar como ID en la tabla) y su estado: activo o inactivo. Entonces, si se detiene el bot, la información de suscripción permanecerá y podrá usarse si desean volver a usar el bot. No se necesita ninguna otra información sobre el usuario por ahora. Ahora la pregunta principal: ¿cómo comprobar esto? Necesitamos iniciar nuestra aplicación. Hasta ahora, el archivo principal docker-compose.yml no tiene conexión con la base de datos y también necesitamos aprender cómo depurar la aplicación junto con la base de datos. Por lo tanto, iniciemos la aplicación con Intellij IDEA. Para probar esto necesitaremos ejecutar nuestro método principal en JavarushTelegramBotApplication. Para separar el trabajo de implementación y prueba, usaremos otro archivo con propiedades: application-test.properties . Con esta plantilla le informamos a Spring que este archivo se utilizará para el perfil de prueba . Cuando no especificamos un perfil, se utiliza el perfil predeterminado (verifique esto en sus registros cuando ejecute SpringBoot: se escribirá sobre esto en las primeras líneas). Así es como se verá:
# 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
Y las propiedades de la aplicación principal se verán ligeramente diferentes:
# 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 diferencia significativa está en el campo spring.datasource.url: en el perfil de prueba tenemos una URL en localhost . Es decir, se espera que la aplicación se ejecute fuera de Docker, lo cual es cierto, porque al depurar ejecutaremos nuestro proyecto en Intellij IDEA y esperaremos tener acceso a la base de datos desde la máquina local. Pero la URL application.properties ya contiene una diferente: jrtb-db . Este será el nombre de nuestra base de datos en docker-compose, y de esta forma nuestra aplicación Docker podrá acceder a la base de datos. ¿Por qué? Por lo tanto, se iniciarán dentro de la misma ventana acoplable y se conocerán entre sí de esta manera. Esto es necesario para que tengamos una infraestructura cerrada para el proyecto. ¿Pero cómo iniciar el perfil al inicio? Para hacer esto, puede configurar el inicio del método principal en Intellij IDEA. Para esto, existe Editar configuraciones : vaya a la clase principal de JavarushTelegramBotApplication, haga clic en la flecha verde al lado de la declaración del método principal y seleccione Modificar configuración de ejecución : "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 10ingrese las variables necesarias y configure el perfil. En Intellij IDEA, la interfaz de esta ventana de configuración ha cambiado ligeramente, por lo que recomiendo a todos que actualicen IDEA a la última versión para que veamos la misma imagen: "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 11en el campo Variables de entorno , debemos agregar el nombre del bot y las variables del token usando la siguiente plantilla: nombre_variable1=valor1; nombre_variable2=valor2 . Es decir, clave=valor están separados por punto y coma. En nuestro caso será así: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (tendrás un nombre y token diferente para el bot) A continuación, selecciona el campo Agregar opciones de VM en el botón Modificar opciones : Escribir : -Dspring.profiles.active =prueba : esto le indicará a SpringBoot que use el perfil de prueba, lo que significa que las propiedades se tomarán de application-test.properties. Como resultado, se verá así: Ahora lanzamos nuestra base de datos de prueba: docker-compose -f docker-compose-test.yml up Y exactamente de esta manera, sin el prefijo -d, para que los registros se puedan ver inmediatamente en el terminal, si es necesario. Y el último paso es simplemente ejecutar el método principal. Si hace todo de la misma manera que lo describí, terminará con: La segunda línea de los registros será una descripción de lo que obtuvo el perfil de prueba. Revisamos MySQLWorkbench y ejecutamos dos comandos para verificar que la migración se haya implementado y que todo esté funcionando (aunque esto es visible en los registros de inicio de la aplicación, definitivamente vale la pena verificarlo):"Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 12"Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 13"Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 14
  1. utilizar dev_jrtb_db;
  2. mostrar mesas;
Resultado: "Proyecto Java de la A a la Z": Agregando todo lo relacionado con la base de datos.  Parte 1 - 15Como esperábamos, obtuvimos dos tablas. El primero es técnico para contabilizar las migraciones, el segundo es nuestra tabla para usuarios de Telegram. Todo: se ha agregado la ruta migratoria junto con la base de datos. Ahora las nuevas migraciones se producirán como un reloj. Lo más difícil es la primera configuración y lanzamiento del proceso. A continuación , estamos completando el trabajo en esta tarea global: agregar bases de datos a docker-compose.yml, agregar una capa de Repositorio, estadísticas para el bot, escribir y actualizar pruebas y documentación.

Al principio de este artículo encontrará una lista de todos los materiales de la serie.

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