JavaRush /Blogue Java /Random-PT /Adicionamos tudo relacionado ao banco de dados. (Parte 1)...
Roman Beekeeper
Nível 35

Adicionamos tudo relacionado ao banco de dados. (Parte 1) - "Projeto Java de A a Z"

Publicado no grupo Random-PT
Passo a passo estamos caminhando em direção ao nosso objetivo. "Projeto Java de A a Z": Adicionando tudo relacionado ao banco de dados.  Parte 1 - 1Hoje precisamos resolver muitas tarefas:
  1. Adicionar Flyway. Aqui iremos configurar a implantação do banco de dados para o projeto.
  2. Adicione um esquema de banco de dados.
  3. Adicione uma camada de repositório.
  4. Adicione um comando para estatísticas do bot.
  5. Afinal, escreva testes.
Então sente-se, sente-se, haverá uma longa leitura. Já aprendemos como implantar nosso aplicativo usando docker e docker-compose. Não foi fácil e parabéns a quem conseguiu. Se você tiver alguma dúvida sobre a implementação, poderá consultar o código nesta solicitação pull .

Adicionando Flyway

Para adicionar o Flyway, você precisa ter um banco de dados, que adicionaremos como outro serviço no docker-compose. Da última vez eu disse que o docker-compose possui uma seção de serviços, que é justamente responsável por adicionar e gerenciar uma determinada infraestrutura - ou seja, um conjunto de aplicações/bancos de dados/mensageiros, etc.
Já falei sobre o que é Flyway e como adicioná-lo a um aplicativo SpringBoot . Aconselho você a refrescar a memória antes de ler este artigo. Você também pode ler o arquivo README.md do projeto com uma demonstração do artigo sobre Flyway + SpringBoot.
A primeira coisa que fazemos é atualizar nosso branch principal no projeto (git pull) e criar um novo com o nome da nossa tarefa - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Deixe-me lembrá-lo: renomeamos os ramos para que fosse possível ordenar a sequência de tarefas do projeto apenas pelo nome. Isso permitirá que você passe rapidamente de uma etapa para outra. Agora você pode trabalhar em paz. Precisamos adicionar três dependências:
<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>
A primeira dependência é responsável por adicionar FlyWay ao projeto, a segunda adiciona a capacidade de conexão ao banco de dados MySQL. O terceiro é o SpringBoot starter, que lança toda a magia de usar um banco de dados no Spring. E vamos adicionar também um lombok para não escrever getters e setters:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
Agora precisamos de um banco de dados para desenvolvimento. Vamos criá-lo por enquanto ( até que eu tenha uma ideia melhor ) como um arquivo docker-compose separado e um arquivo separado para application.properties. Existem algo no desenvolvimento (e no ecossistema Spring em particular) como perfis. Dependendo do perfil, diferentes configurações são lançadas para operação. Acho que no futuro combinaremos o docker-compose em um arquivo e garantiremos que apenas um banco de dados seja iniciado para desenvolvimento nas configurações que precisamos. Por enquanto faremos isso:
  1. Vamos criar um arquivo na raiz do projeto docker-compose-test.yml, no qual será lançado apenas o banco de dados com configurações próprias.
  2. Vamos criar um arquivo application-test.properties com configurações que correspondam às configurações do arquivo docker-compose-test.yml.
Para trabalhar com MySQL, peguei a imagem oficial do DockerHub : "Projeto Java de A a Z": Adicionando tudo relacionado ao banco de dados.  Parte 1 - 2Após percorrer rapidamente, encontrei as variáveis ​​necessárias: MYSQL_DATABASE - nome do banco de dados MYSQL_USER - nome de usuário do banco de dados MYSQL_PASSWORD - senha do usuário do banco de dados E como elas precisam ser escritas corretamente:
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
Depois disso, crio docker-compose-test.yml na raiz do projeto:
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 executar este arquivo específico para trabalhar com o docker-compose, você precisa usar o sinalizador -f na solicitação . Isso significa que o nome do arquivo iniciado será fornecido, em vez do padrão docker-compose.yml ser usado. Portanto, a solicitação ficará assim: docker-compose -f docker-compose-test.yml up -d Acontece que primeiro dizemos qual arquivo pegar ( -f docker-compose-test.yml ) e depois digamos que precisamos aumentar os serviços e fazer isso no modo daemon ( up -d ) - ou seja, para que o processo seja executado fora da sessão do terminal em que este comando foi iniciado. Lançamos e tentamos nos conectar ao banco de dados para ter certeza de que ele está funcionando e pode ser usado. Para fazer isso, abra o familiar MySQL Workbench ( já falamos sobre isso aqui ) e crie uma nova conexão: "Projeto Java de A a Z": Adicionando tudo relacionado ao banco de dados.  Parte 1 - 3Precisamos preencher os seguintes campos:
  • Nome da conexão - nome da conexão - opcionalmente, DEV_JRTB_DB;
  • Hostname - aqui é o endereço onde o banco de dados está implantado. No nosso caso, tudo permanecerá como estava: 127.0.0.1 ou localhost;
  • nome de usuário - aqui será root, como escrevemos em docker-compose;
  • senha - também root.
Depois disso, você precisa verificar se há conexão. Para fazer isso, clique em Testar conexão : "Projeto Java de A a Z": Adicionando tudo relacionado ao banco de dados.  Parte 1 - 4Como resultado, obtemos: Falha ao conectar ao MySQL... Por quê? Vamos ao terminal e vemos o que aconteceu com o contêiner docker. Vamos escrever no terminal: "Java-проект от А до Я": Добавляем все, что связано с БД. Часть 1 - 5Vemos que o terminal foi criado há 59 minutos e a reinicialização foi de 55 segundos... por quê? Não está claro, você precisa olhar os registros. Vá para a raiz do projeto no terminal e execute o seguinte comando: docker-compose -f docker-compose-test.yml logs
Nós temos:

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

Agora está claro que o banco de dados nunca foi iniciado com nossas configurações. O erro é o mesmo, então vamos isolá-lo da planilha:
2021-02-28 11:03:37+00:00 [ERRO] [Ponto de entrada]: O banco de dados não foi inicializado e a opção de senha não foi especificada dev-jrtb-db | Você precisa especificar um entre MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD e MYSQL_RANDOM_ROOT_PASSWORD
Ou seja, ele precisa determinar a senha do usuário root - o usuário principal. Ok, agora vamos atualizar nosso arquivo:
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
Removemos essas variáveis ​​de usuário e senha e adicionamos apenas a senha do usuário root. Isso significa que o usuário root agora terá uma senha root. Pelo menos é o que assumimos. Agora vamos executá-lo e ver o que acontece: docker-compose -f docker-compose-test.yml up -d E imediatamente ver o que os logs nos dizem: docker-compose -f docker-compose-test.yml logs
Vamos olhar:

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 não há mais erros, então você pode ver se haverá acesso. Mas, infelizmente, não há acesso novamente... Nada: vamos descobrir mais! "Java-проект от А до Я": Добавляем все, что связано с БД. Часть 1 - 6Para encerrar o docker-compose e excluir todos os contêineres, você precisa escrever: docker-compose -f docker-compose-test.yml down Aqui especificamos o arquivo a ser excluído. O que fazer? Vamos pesquisar no Google: talvez alguém tenha feito melhor. A consulta mais simples: “exemplo de mysql no docker-compose” nos ajuda a encontrar um link para um recurso médio. Eles dão este exemplo:
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:
Nós o adaptamos às nossas necessidades e obtemos:
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'
Lançamos esta opção com o comando já conhecido por nós: docker-compose -f docker-compose-test.yml up -d Tentamos novamente acessar o banco de dados através do MySQLWorkBench: "Java-проект от А до Я": Добавляем все, что связано с БД. Часть 1 - 7Finalmente, o acesso apareceu. Mas agora me pergunto o que influenciou isso. Estou pecando nesta parte:
expose:
   # Opens port 3306 on the container
   - '3306'
É fácil verificar: sem isso nada funciona :D. Vamos verificar: exclua esta parte, reinicie o docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up Tentamos entrar no banco de dados através do ambiente de trabalho: está tudo bem . Então a única opção é a versão do banco de dados. Afirma claramente 5.7, ou seja, se você alterá-lo para o mais recente, não deverá funcionar. Eu reiniciei - e realmente não funciona... "Java-проект от А до Я": Добавляем все, что связано с БД. Часть 1 - 8Aparentemente, eles têm alguns problemas com a imagem do docker na versão mais recente. Ok sem problemas. Isso geralmente acontece com software livre. Usaremos a versão 5.7. Vamos ver se existe um banco de dados que precisamos - dev_jrtb_db. Para fazer isso, execute o comando Query no MySQL Workbench SHOW DATABASES : "Java-проект от А до Я": Добавляем все, что связано с БД. Часть 1 - 9Sim, está presente na saída. Ótimo, podemos seguir em frente. A seguir, vamos adicionar nossa primeira migração. Com base nas tarefas do artigo “Planejamento de projeto: medir duas vezes, cortar uma vez”, criaremos nossa primeira tabela tg_user. Todas as migrações estarão localizadas na pasta projectDir/src/main/resources/db/migration e o nome será: V00001__add_tg_user_table.sql . Por que existe esse nome nessa pasta - eu descrevi no artigo sobre Spring + flyway. Esta é a aparência da nossa primeira migração: 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
);
Ou seja, aqui simplesmente criamos uma tabela de um usuário que possui apenas um ID de chat (elemento único que pode ser usado para funcionar como ID na tabela) e seu estado - ativo ou inativo. Portanto, se o bot for interrompido, as informações de assinatura permanecerão e poderão ser usadas caso queiram usar o bot novamente. Nenhuma outra informação sobre o usuário é necessária por enquanto. Agora a questão principal: como verificar isso? Precisamos lançar nosso aplicativo. Até agora, o arquivo principal docker-compose.yml não tem conexão com o banco de dados, e também precisamos aprender como depurar o aplicativo junto com o banco de dados. Portanto, vamos lançar o aplicativo com Intellij IDEA. Para testar isso, precisaremos executar nosso método principal em JavarushTelegramBotApplication. Para separar o trabalho de implantação e teste, usaremos outro arquivo com propriedades - application-test.properties . Com este template informamos ao Spring que este arquivo será usado para o perfil de teste . Quando não especificamos um perfil, o perfil padrão é usado (verifique isso em seus logs ao executar o SpringBoot: estará escrito sobre isso nas primeiras linhas). Será assim que será:
# 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 o application.properties principal terá uma aparência um pouco diferente:
# 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
A diferença significativa está no campo spring.datasource.url: no perfil de teste temos uma URL em localhost . Ou seja, espera-se que a aplicação rode fora do Docker, o que é verdade, pois durante a depuração executaremos nosso projeto no Intellij IDEA e esperamos ter acesso ao banco de dados da máquina local. Mas o URL application.properties já contém outro - jrtb-db . Este será o nome do nosso banco de dados no docker-compose, e desta forma a nossa aplicação docker poderá acessar o banco de dados. Por que? Portanto, eles serão lançados dentro do mesmo docker-compose e se conhecerão dessa forma. Isso é necessário para que tenhamos uma infraestrutura fechada para o projeto. Mas como lançar o perfil na inicialização? Para fazer isso, você pode configurar o lançamento do método principal no Intellij IDEA. Para isso existe Edit Configurations : vá até a classe principal do JavarushTelegramBotApplication, clique na seta verde oposta à declaração do método principal e selecione Modify Run Configuration : "Java-проект от А до Я": Добавляем все, что связано с БД. Часть 1 - 10Insira as variáveis ​​necessárias e configure o perfil. No Intellij IDEA, a interface desta janela de configuração mudou um pouco, então aconselho a todos que atualizem o IDEA para a versão mais recente para que possamos ver a mesma imagem: "Java-проект от А до Я": Добавляем все, что связано с БД. Часть 1 - 11No campo Variáveis ​​de ambiente , precisamos adicionar o nome do bot e as variáveis ​​​​de token usando o seguinte modelo: nome_variável1=valor1; nome_variável2=valor2 . Ou seja, key=value são separados por ponto e vírgula. No nosso caso será assim: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (você terá um nome e token diferente para o bot) Em seguida, selecione o campo Adicionar opções de VM no botão Modificar opções : Escreva : -Dspring.profiles.active =test - isso dirá ao SpringBoot para usar o perfil de teste, o que significa que as propriedades serão obtidas de application-test.properties. Como resultado, ficará assim: Agora lançamos nosso banco de dados de teste: docker-compose -f docker-compose-test.yml up E exatamente assim, sem o prefixo -d, para que os logs possam ser vistos imediatamente em o terminal, se houver necessidade. E a última etapa é simplesmente executar o método principal. Se você fizer tudo da mesma maneira que descrevi, você terá: A segunda linha dos logs será uma descrição do que o perfil de teste ganhou. Passamos pelo MySQLWorkbench e executamos dois comandos para verificar se a migração foi implementada e se tudo está funcionando (embora isso seja visível nos logs de inicialização do aplicativo, definitivamente vale a pena verificar):"Java-проект от А до Я": Добавляем все, что связано с БД. Часть 1 - 12"Java-проект от А до Я": Добавляем все, что связано с БД. Часть 1 - 13"Java-проект от А до Я": Добавляем все, что связано с БД. Часть 1 - 14
  1. use dev_jrtb_db;
  2. mostrar tabelas;
Resultado: "Java-проект от А до Я": Добавляем все, что связано с БД. Часть 1 - 15Como esperávamos, obtivemos duas tabelas. A primeira é técnica para contabilizar migrações, a segunda é a nossa tabela para usuários do Telegram. Todos: Flyway junto com o banco de dados foi adicionado. Agora, novas migrações funcionarão como um relógio. O mais difícil é a primeira configuração e lançamento do processo. Continuando , estamos concluindo o trabalho nesta tarefa global: adicionando bancos de dados ao docker-compose.yml, adicionando uma camada de Repositório, estatísticas para o bot, escrevendo e atualizando testes e documentação.

Uma lista de todos os materiais da série está no início deste artigo.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION