JavaRush /Blog Java /Random-PL /Dodajemy wszystko co związane z bazą danych. (Część 1) - ...
Roman Beekeeper
Poziom 35

Dodajemy wszystko co związane z bazą danych. (Część 1) - „Projekt Java od A do Z”

Opublikowano w grupie Random-PL
Krok po kroku zmierzamy do celu. „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 1Dziś musimy rozwiązać wiele zadań:
  1. Dodaj Flyway. Tutaj skonfigurujemy wdrożenie bazy danych dla projektu.
  2. Dodaj schemat bazy danych.
  3. Dodaj warstwę repozytorium.
  4. Dodaj polecenie dla statystyk bota.
  5. W końcu pisz testy.
Więc usiądź, usiądź, będzie długa lektura. Nauczyliśmy się już, jak wdrażać naszą aplikację za pomocą dockera i docker-compose. Nie było to łatwe i gratuluję tym, którym się to udało. Jeśli masz jakiekolwiek pytania dotyczące implementacji, możesz spojrzeć na kod w tym żądaniu ściągnięcia .

Dodawanie Flywaya

Aby dodać Flyway, musisz mieć bazę danych, którą dodamy jako kolejną usługę w docker-compose. Ostatnim razem mówiłem, że docker-compose ma sekcję usług, która jest właśnie odpowiedzialna za dodawanie i zarządzanie określoną infrastrukturą - czyli zestawem aplikacji/baz danych/komunikatorów itp.
O tym , czym jest Flyway i jak dodać go do aplikacji SpringBoot, mówiłem już wcześniej . Radzę odświeżyć pamięć przed przeczytaniem tego artykułu. Możesz także przeczytać plik README.md projektu z demonstracją artykułu o Flyway + SpringBoot.
Pierwszą rzeczą, którą robimy, to aktualizujemy naszą główną gałąź w projekcie (git pull) i tworzymy nową o nazwie naszego zadania - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Przypomnę: zmieniliśmy nazwy oddziałów, aby można było sortować kolejność zadań w projekcie wyłącznie według nazwy. Dzięki temu będziesz mógł szybko przejść z jednego kroku do drugiego. Teraz możesz spokojnie pracować. Musimy dodać trzy zależności:
<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>
Pierwsza zależność odpowiada za dodanie FlyWay do projektu, druga dodaje możliwość połączenia z bazą danych MySQL. Trzeci to starter SpringBoot, który uruchamia całą magię korzystania z bazy danych na wiosnę. Dodajmy też lombok, żeby nie pisać getterów i setterów:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
Teraz potrzebujemy bazy danych do rozwoju. Na razie utworzymy go ( dopóki nie wpadniemy na lepszy pomysł ) jako oddzielny plik tworzenia okna dokowanego i osobny plik dla application.properties. Istnieje coś takiego w fazie rozwoju (a zwłaszcza w ekosystemie Spring) jako profile. W zależności od profilu uruchamiane są różne ustawienia do pracy. Myślę, że w przyszłości połączymy funkcję docker compose w jeden plik i upewnimy się, że tylko jedna baza danych zostanie uruchomiona w celu opracowania potrzebnych nam ustawień. Na razie zrobimy to:
  1. Stwórzmy w katalogu głównym projektu docker-compose-test.yml plik, w którym uruchomiona zostanie jedynie baza danych z własnymi ustawieniami.
  2. Utwórzmy plik application-test.properties z ustawieniami odpowiadającymi ustawieniom w pliku docker-compose-test.yml.
Aby pracować z MySQL, wziąłem oficjalny obraz z DockerHub : „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 2Po szybkim przewinięciu znalazłem niezbędne zmienne: MYSQL_DATABASE - nazwa bazy danych MYSQL_USER - nazwa użytkownika bazy danych MYSQL_PASSWORD - hasło użytkownika bazy danych Oraz jak należy je poprawnie zapisać:
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
Następnie tworzę plik docker-compose-test.yml w katalogu głównym projektu:
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
Aby uruchomić ten konkretny plik do pracy z docker-compose, musisz użyć flagi -f w żądaniu . Oznacza to, że zostanie podana nazwa uruchamianego pliku, a nie standardowy plik docker-compose.yml. Dlatego żądanie będzie wyglądać następująco: docker-compose -f docker-compose-test.yml up -d Okazuje się, że najpierw mówimy, który plik ma pobrać ( -f docker-compose-test.yml ), a następnie powiedzmy, że musimy podnieść usługi i zrobić to w trybie demona ( up -d ) - czyli tak, aby proces przebiegał poza sesją terminala, w której uruchomiono to polecenie. Uruchamiamy i próbujemy połączyć się z bazą danych, aby upewnić się, że jest uruchomiona i można z niej korzystać. Aby to zrobić, otwórz znajomy MySQL Workbench ( rozmawialiśmy o tym tutaj ) i utwórz nowe połączenie: „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 3Musimy wypełnić następujące pola:
  • Nazwa połączenia - nazwa połączenia - opcjonalnie DEV_JRTB_DB;
  • Nazwa hosta – tutaj znajduje się adres, pod którym wdrożono bazę danych. W naszym przypadku wszystko pozostanie tak jak było: 127.0.0.1 lub localhost;
  • username - tutaj będzie root, tak jak napisaliśmy w docker-compose;
  • hasło - także root.
Następnie musisz sprawdzić, czy połączenie będzie działać. Aby to zrobić, kliknij Testuj połączenie : „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 4W rezultacie otrzymamy: Nie udało się połączyć z MySQL... Dlaczego? Podchodzimy do terminala i sprawdzamy, co stało się z kontenerem dokującym. Napiszmy w terminalu: „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 5Widzimy, że terminal został utworzony 59 minut temu, a restart trwał 55 sekund… dlaczego? Nie jest jasne, trzeba spojrzeć na logi. Przejdź do katalogu głównego projektu w terminalu i uruchom następującą komendę: docker-compose -f docker-compose-test.yml logs
Otrzymujemy:

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

Teraz jest jasne, że baza danych nigdy nie była uruchamiana z naszymi ustawieniami. Błąd jest ten sam, więc wyizolujmy go z arkusza:
2021-02-28 11:03:37+00:00 [BŁĄD] [Punkt wejścia]: Baza danych nie została zainicjowana i nie określono opcji hasła dev-jrtb-db | Musisz podać jedno z MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD i MYSQL_RANDOM_ROOT_PASSWORD
Oznacza to, że musi określić hasło dla użytkownika root - głównego użytkownika. OK, teraz zaktualizujemy nasz plik:
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
Usunęliśmy te zmienne dla użytkownika i hasła i dodaliśmy tylko hasło dla użytkownika root. Oznacza to, że użytkownik root będzie teraz miał hasło roota. Przynajmniej tak zakładamy. Teraz uruchommy go i zobaczmy, co się stanie: docker-compose -f docker-compose-test.yml up -d I od razu zobaczmy, co powiedzą nam logi: docker-compose -f docker-compose-test.yml logs
Spójrzmy:

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.

Wygląda na to, że nie ma już błędów, więc możesz sprawdzić, czy będzie dostęp. Ale niestety znowu nie ma dostępu... Nic: zastanowimy się dalej! „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 6Aby zakończyć docker-compose i usunąć wszystkie kontenery, musisz napisać: docker-compose -f docker-compose-test.yml down Tutaj określiliśmy plik do usunięcia. Co robić? Wyszukajmy w Google: może ktoś zrobił to lepiej. Najprostsze zapytanie: „przykład mysql w docker-compose” pomaga nam znaleźć link do średniego zasobu. Podają taki przykład:
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:
Dostosowujemy go do naszych potrzeb i otrzymujemy:
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'
Uruchamiamy tę opcję znanym nam już poleceniem: docker-compose -f docker-compose-test.yml up -d Ponownie próbujemy uzyskać dostęp do bazy danych poprzez MySQLWorkBench: „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 7Wreszcie pojawił się dostęp. Ale teraz zastanawiam się, co na to wpłynęło. Grzeszę w tej części:
expose:
   # Opens port 3306 on the container
   - '3306'
Łatwo sprawdzić: bez tego nic nie powinno działać :D. Sprawdźmy: usuń tę część, uruchom ponownie docker-compose: docker-compose -f docker-compose-test.yml w dół docker-compose -f docker-compose-test.yml w górę Próbujemy wejść do bazy danych przez środowisko robocze: wszystko jest w porządku . Wtedy jedyną opcją jest wersja bazy danych. Wyraźnie jest napisane, że jest to wersja 5.7, czyli jeśli zmienisz ją na najnowszą, nie powinna działać. Uruchomiłem go ponownie - i naprawdę nie działa... „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 8Najwyraźniej mają pewne problemy z obrazem okna dokowanego w najnowszej wersji. Dobra, nie ma problemu. Często zdarza się to w przypadku wolnego oprogramowania. Będziemy używać wersji 5.7. Zobaczmy, czy potrzebujemy bazy danych - dev_jrtb_db. Aby to zrobić, uruchom polecenie Query w MySQL Workbench POKAŻ BAZY DANYCH : „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 9Tak, jest obecne w wynikach. Świetnie, możemy iść dalej. Następnie dodajmy naszą pierwszą migrację. Na podstawie zadań z artykułu „Planowanie projektu: zmierz dwa razy, wytnij raz” utworzymy naszą pierwszą tabelę tg_user. Wszystkie migracje będą zlokalizowane w folderze ProjectDir/src/main/resources/db/migration i będą miały następującą nazwę: V00001__add_tg_user_table.sql . Dlaczego w tym folderze jest taka nazwa - opisałem to w artykule o Spring + flyway. Tak będzie wyglądać nasza pierwsza migracja: 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
);
Oznacza to, że tutaj po prostu tworzymy tabelę użytkownika, który ma tylko identyfikator czatu (unikalny element, który może służyć jako identyfikator w tabeli) i jego stan - aktywny lub nieaktywny. Jeśli więc bot zostanie zatrzymany, informacje o subskrypcji pozostaną i będzie można ich użyć, jeśli użytkownik będzie chciał ponownie skorzystać z bota. Żadne inne informacje o użytkowniku nie są na razie potrzebne. Teraz podstawowe pytanie: jak to sprawdzić? Musimy uruchomić naszą aplikację. Póki co główny plik docker-compose.yml nie ma połączenia z bazą danych, musimy się też nauczyć jak debugować aplikację razem z bazą danych. Dlatego uruchommy aplikację za pomocą Intellij IDEA. Aby to przetestować, będziemy musieli uruchomić naszą główną metodę w JavarushTelegramBotApplication. Aby oddzielić pracę wdrożeniową od testowania użyjemy innego pliku z właściwościami - test-aplikacji.properties . Za pomocą tego szablonu informujemy Springa, że ​​ten plik będzie używany w profilu testowym . Jeśli nie określimy profilu, zostanie użyty profil domyślny (sprawdź to w swoich logach podczas uruchamiania SpringBoot: będzie o tym napisane w pierwszych linijkach). Oto jak to będzie wyglądać:
# 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
A główne właściwości aplikacji będą wyglądać nieco inaczej:
# 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
Istotna różnica dotyczy pola spring.datasource.url: w profilu testowym mamy adres URL na localhost . Oznacza to, że aplikacja ma działać poza Dockerem, co jest prawdą, ponieważ podczas debugowania nasz projekt uruchomimy w Intellij IDEA i spodziewamy się, że dostęp do bazy danych będziemy mieli z lokalnej maszyny. Ale adres URL aplikacji.properties zawiera już inny - jrtb-db . Będzie to nazwa naszej bazy danych w trybie docker-compose, dzięki czemu nasza aplikacja dokera będzie mogła dotrzeć do bazy danych. Dlaczego? Dlatego zostaną uruchomione w ramach tego samego okna dokowanego i w ten sposób będą się o sobie nawzajem dowiedzieć. Jest to konieczne, abyśmy mieli jedną zamkniętą infrastrukturę dla projektu. Ale jak uruchomić profil przy starcie? Aby to zrobić, możesz skonfigurować uruchomienie metody głównej w Intellij IDEA. W tym celu dostępna jest opcja Edytuj konfiguracje : przejdź do głównej klasy aplikacji JavarushTelegramBotApplication, kliknij zieloną strzałkę obok deklaracji głównej metody i wybierz Modyfikuj konfigurację uruchamiania : „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 10Wprowadź niezbędne zmienne i skonfiguruj profil. W Intellij IDEA interfejs tego okna konfiguracyjnego uległ niewielkiej zmianie, dlatego radzę każdemu zaktualizować IDEA do najnowszej wersji, abyśmy widzieli ten sam obraz: „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 11W polu Zmienne środowiskowe musimy dodać nazwę bota i zmienne tokena za pomocą następujący szablon: nazwa_zmiennej1=wartość1; nazwa_zmiennej2=wartość2 . Oznacza to, że klucz=wartość są oddzielone średnikami. W naszym przypadku będzie to wyglądało tak: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (będziesz miał inną nazwę i token dla bota) Następnie w przycisku Modyfikuj opcje wybierz pole Dodaj opcje VM : „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 12Napisz : -Dspring.profiles.active =test - to powie SpringBootowi użycie profilu testowego, co oznacza, że ​​właściwości zostaną pobrane z application-test.properties. W rezultacie będzie to wyglądać tak: „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 13Teraz uruchamiamy naszą testową bazę danych: docker-compose -f docker-compose-test.yml up I dokładnie w ten sposób, bez prefiksu -d, aby logi były od razu widoczne w terminal, jeśli jest potrzebny. Ostatnim krokiem jest po prostu uruchomienie głównej metody. Jeśli zrobisz wszystko w taki sam sposób, jak opisałem, otrzymasz: „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 14Druga linia logów będzie opisem tego, co uzyskał profil testowy. Przechodzimy przez MySQLWorkbench i wykonujemy dwie komendy, aby sprawdzić, czy migracja przebiegła i wszystko działa (choć widać to po logach uruchamiania aplikacji, zdecydowanie warto to sprawdzić):
  1. użyj dev_jrtb_db;
  2. pokaż tabele;
Wynik: „Projekt Java od A do Z”: Dodanie wszystkiego co związane z bazą danych.  Część 1 - 15zgodnie z oczekiwaniami otrzymaliśmy dwa stoły. Pierwsza dotyczy technicznego rozliczania migracji, druga to nasza tabela dla użytkowników Telegramu. Wszystko: Dodano Flyway wraz z bazą danych. Teraz nowe migracje będą przebiegać jak w zegarku. Najtrudniejszą rzeczą jest pierwsza konfiguracja i uruchomienie procesu. W kontynuacji kończymy prace nad tym globalnym zadaniem: dodaniem baz danych do pliku docker-compose.yml, dodaniem warstwy Repozytorium, statystykami dla bota, napisaniem i aktualizacją testów oraz dokumentacji.

Lista wszystkich materiałów wchodzących w skład serii znajduje się na początku artykułu.

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