JavaRush /Java Blogu /Random-AZ /Verilənlər bazası ilə əlaqəli hər şeyi əlavə edirik. (1-c...
Roman Beekeeper
Səviyyə

Verilənlər bazası ilə əlaqəli hər şeyi əlavə edirik. (1-ci hissə) - "A-dan Z-yə Java layihəsi"

Qrupda dərc edilmişdir
Addım-addım hədəfimizə doğru irəliləyirik. "A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-1 hissəBu gün bir çox vəzifəni həll etməliyik:
  1. Flyway əlavə edin. Burada layihə üçün verilənlər bazasının yerləşdirilməsini konfiqurasiya edəcəyik.
  2. Verilənlər bazası sxemi əlavə edin.
  3. Repozitor təbəqəsi əlavə edin.
  4. Bot statistikası üçün əmr əlavə edin.
  5. Testlər yazın axı.
Odur ki, geri otur, geri otur, uzun oxunuş olacaq. Biz artıq docker və docker-compose istifadə edərək tətbiqimizi necə yerləşdirməyi öyrənmişik . Bu asan olmadı və bunu bacaranları təbrik edirəm. Tətbiqlə bağlı hər hansı sualınız varsa, bu çəkmə sorğusundakı koda baxa bilərsiniz .

Flyway əlavə olunur

Flyway əlavə etmək üçün docker-compose-da başqa bir xidmət kimi əlavə edəcəyimiz verilənlər bazanız olmalıdır. Keçən dəfə mən dedim ki, docker-compose-un xidmətlər bölməsi var, o, müəyyən bir infrastrukturun - yəni proqramlar/verilənlər bazası/messencerlər dəsti və s. əlavə etmək və idarə etmək üçün dəqiq cavabdehdir.
Flyway nədir və onu SpringBoot proqramına necə əlavə etmək barədə artıq danışmışam . Məsləhət görürəm ki, bu yazını oxumazdan əvvəl yaddaşınızı təzələyin. Flyway + SpringBoot haqqında məqalənin nümayişi ilə layihənin README.md faylını da oxuya bilərsiniz .
Etdiyimiz ilk şey layihədəki əsas filialımızı yeniləmək (git pull) və tapşırığımızın adı ilə yenisini yaratmaqdır - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Xatırladım: filialların adını elə dəyişdirdik ki, layihədəki tapşırıqların ardıcıllığını yalnız adla çeşidləmək mümkün olsun. Bu, bir addımdan digərinə sürətlə keçməyə imkan verəcəkdir. İndi rahat işləyə bilərsiniz. Üç asılılıq əlavə etməliyik:
<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>
Birinci asılılıq layihəyə FlyWay əlavə etməkdən məsuldur, ikincisi MySQL verilənlər bazasına qoşulma qabiliyyətini əlavə edir. Üçüncüsü SpringBoot başlanğıcıdır, o, Baharda verilənlər bazasından istifadənin bütün sehrlərini işə salır. Həm də lombok əlavə edək ki, alıcılar və təyinçilər yazmasın:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
İndi inkişaf üçün məlumat bazasına ehtiyacımız var. Biz onu hələlik ( mən daha yaxşı bir fikir tapana qədər ) ayrıca docker-compose faylı və application.properties üçün ayrıca fayl kimi yaradacağıq . İnkişafda (və xüsusilə Bahar ekosistemində) profillər kimi bir şey var. Profildən asılı olaraq, əməliyyat üçün müxtəlif parametrlər işə salınır. Düşünürəm ki, gələcəkdə biz docker-compose-ni bir faylda birləşdirəcəyik və bizə lazım olan parametrlər üzrə inkişaf üçün yalnız bir verilənlər bazasının işə salınmasına əmin olacağıq. Hələlik bunu edəcəyik:
  1. Docker-compose-test.yml layihəsinin kökündə yalnız öz parametrləri olan verilənlər bazası işə salınacaq fayl yaradaq.
  2. Docker-compose-test.yml faylındakı parametrlərə uyğun gələn parametrlərlə application-test.properties faylı yaradaq.
MySQL ilə işləmək üçün rəsmi şəkli DockerHub- dan götürdüm : "A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-2 hissəSürətlə vərəqlədikdən sonra lazımi dəyişənləri tapdım: MYSQL_DATABASE - verilənlər bazası adı MYSQL_USER - verilənlər bazası istifadəçi adı MYSQL_PASSWORD - verilənlər bazası istifadəçi parolu və onların necə düzgün yazılması lazımdır:
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
Bundan sonra layihə kökündə docker-compose-test.yml yaradıram:
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
Docker-compose ilə işləmək üçün bu xüsusi faylı işə salmaq üçün sorğuda -f bayrağından istifadə etməlisiniz . Bu o deməkdir ki, qəbul edilən standart docker-compose.yml deyil, işə salınan faylın adı veriləcək. Buna görə də sorğu belə görünəcək: docker-compose -f docker-compose-test.yml up -d Belə çıxır ki, əvvəlcə hansı faylı götürəcəyimizi deyirik ( -f docker-compose-test.yml ) və sonra biz deyin ki, xidmətləri artırmalı və bunu daemon rejimində etməliyik ( up -d ) - yəni proses bu əmrin işə salındığı terminal seansından kənarda işləsin. Biz işə salırıq və onun işlək olduğuna və istifadə oluna biləcəyinə əmin olmaq üçün verilənlər bazasına qoşulmağa çalışırıq. Bunu etmək üçün tanış MySQL Workbench-i açın ( burada bu barədə danışdıq ) və yeni bir əlaqə yaradın: "A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-3 hissəAşağıdakı sahələri doldurmalıyıq:
  • Bağlantı adı - əlaqə adı - istəyə görə, DEV_JRTB_DB;
  • Hostname - burada verilənlər bazasının yerləşdirildiyi ünvandır. Bizim vəziyyətimizdə hər şey olduğu kimi qalacaq: 127.0.0.1 və ya localhost;
  • istifadəçi adı - docker-compose-də yazdığımız kimi burada kök olacaq;
  • parol - həmçinin kök.
Bundan sonra əlaqənin olub olmadığını yoxlamaq lazımdır. Bunun üçün klikləyin Bağlantı Testi : "A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-4 hissəNəticədə əldə edirik: MySQL-ə qoşula bilmədik... Niyə? Biz terminala gedirik və doker konteynerinə nə baş verdiyini görürük. Terminalda yazaq: "A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-5 hissəTerminalın 59 dəqiqə əvvəl yaradıldığını, yenidən başlamasının isə 55 saniyə olduğunu görürük... niyə? Aydın deyil, qeydlərə baxmaq lazımdır. Terminalda layihə kökünə gedin və aşağıdakı əmri işlədin: docker-compose -f docker-compose-test.yml logs
Biz əldə edirik:

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

İndi aydın oldu ki, verilənlər bazası heç vaxt parametrlərimizlə başlamamışdır. Səhv eynidir, ona görə də onu vərəqdən təcrid edək:
28-02-2021 11:03:37+00:00 [XƏTƏ] [Giriş nöqtəsi]: Verilənlər bazası işə salınmayıb və parol seçimi göstərilməyib dev-jrtb-db | MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD və MYSQL_RANDOM_ROOT_PASSWORD-dan birini təyin etməlisiniz
Yəni o, kök istifadəçi - əsas istifadəçi üçün parol təyin etməlidir. Yaxşı, indi faylımızı yeniləyəcəyik:
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
Biz istifadəçi və parol üçün həmin dəyişənləri sildik və yalnız kök istifadəçi üçün parol əlavə etdik. Bu o deməkdir ki, kök istifadəçi artıq root paroluna sahib olacaq. Ən azı bunu güman edirik. İndi onu işə salaq və nə baş verdiyini görək: docker-compose -f docker-compose-test.yml up -d Və dərhal qeydlərin bizə nə dediyini görün: docker-compose -f docker-compose-test.yml logs
Baxaq:

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.

Artıq heç bir səhv yoxdur, ona görə də girişin olub olmadığını görə bilərsiniz. Amma təəssüf ki, yenə giriş yoxdur... Heç nə: biz bunu daha sonra anlayacağıq! "A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-6 hissəDocker-compose-ni dayandırmaq və bütün konteynerləri silmək üçün aşağıdakıları yazmalısınız: docker-compose -f docker-compose-test.yml down Burada biz silinəcək faylı göstərdik. Nə etməli? Google-a baxaq: bəlkə kimsə bunu daha yaxşı edib. Ən sadə sorğu: “docker-compose-da mysql nümunəsi” orta mənbəyə keçid tapmaqda bizə kömək edir. Bu nümunəni verirlər:
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:
Biz onu ehtiyaclarımıza uyğunlaşdırırıq və əldə edirik:
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'
Biz bu seçimi artıq bizə məlum olan komanda ilə işə salırıq: docker-compose -f docker-compose-test.yml up -d Biz MySQLWorkBench vasitəsilə verilənlər bazasına daxil olmağa yenidən cəhd edirik: "A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-7 hissəNəhayət, giriş meydana çıxdı. Amma indi buna nə təsir etdi, görəsən. Bu hissədə günah edirəm:
expose:
   # Opens port 3306 on the container
   - '3306'
Yoxlamaq asandır: bunsuz heç nə işləməməlidir :D. Gəlin yoxlayaq: bu hissəni silin, yenidən başladın docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up Biz verilənlər bazasına tezgah vasitəsilə daxil olmağa çalışırıq: hər şey qaydasındadır . Sonra yeganə seçim verilənlər bazası versiyasıdır. 5.7-ni açıq şəkildə qeyd edir, yəni onu ən sonuncuya dəyişsəniz, işləməməlidir. Mən onu yenidən başladım - və həqiqətən də işləmir... "A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-8 hissəGörünür, onların son versiyada docker təsviri ilə bağlı bəzi problemləri var. Oldu, problem deyil. Bu, çox vaxt pulsuz proqram təminatı ilə baş verir. 5.7 versiyasından istifadə edəcəyik. Görək bizə lazım olan verilənlər bazası varmı - dev_jrtb_db. Bunun üçün MySQL Workbench-də Query əmrini yerinə yetirin VERİLƏNİŞ BAZASINI GÖSTER : "A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-9 hissəBəli, çıxışda mövcuddur. Əla, davam edə bilərik. Sonra, ilk miqrasiyamızı əlavə edək. "Layihənin planlaşdırılması: iki dəfə ölçün, bir dəfə kəsin" məqaləsindəki tapşırıqlara əsaslanaraq ilk cədvəlimizi yaradacağıq tg_user. Bütün köçürmələr projectDir/src/main/resources/db/migration qovluğunda yerləşəcək və adı belə olacaq: V00001__add_tg_user_table.sql . Niyə o qovluqda belə bir ad var - Mən Bahar + flyway haqqında məqalədə təsvir etdim. İlk miqrasiyamız belə görünəcək: 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
);
Yəni, burada biz sadəcə olaraq yalnız söhbət ID-si (cədvəldə ID kimi işləmək üçün istifadə oluna bilən unikal element) və onun vəziyyəti olan istifadəçinin cədvəlini yaradırıq - aktiv və ya qeyri-aktiv. Beləliklə, bot dayandırılsa, abunə məlumatları qalacaq və botdan yenidən istifadə etmək istədikləri təqdirdə istifadə edilə bilər. Hələlik istifadəçi haqqında başqa məlumat lazım deyil. İndi əsas sual: bunu necə yoxlamaq olar? Tətbiqimizi işə salmalıyıq. İndiyə qədər əsas docker-compose.yml faylının verilənlər bazası ilə əlaqəsi yoxdur və biz də verilənlər bazası ilə birlikdə tətbiqi debug etməyi öyrənməliyik. Buna görə də, Intellij IDEA ilə tətbiqi işə salaq. Bunu yoxlamaq üçün əsas metodumuzu JavarushTelegramBotApplication-da işlətməliyik. Yerləşdirmə və sınaq işini ayırmaq üçün xüsusiyyətləri olan başqa bir fayldan istifadə edəcəyik - application-test.properties . Bu şablonla biz Bahara bu faylın test profili üçün istifadə olunacağını bildiririk . Profili göstərmədikdə, standart profil istifadə olunur (SpringBoot-u işləyərkən bunu qeydlərinizdə yoxlayın: bu barədə ilk sətirlərdə yazılacaq). Bu belə görünəcək:
# 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
Əsas application.properties isə bir qədər fərqli görünəcək:
# 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
Əhəmiyyətli fərq spring.datasource.url sahəsindədir: test profilində localhost- da URL-imiz var . Yəni tətbiqin Docker-dən kənarda işləməsi gözlənilir, bu doğrudur, çünki sazlama zamanı biz layihəmizi Intellij IDEA-da işlədəcəyik və yerli maşından verilənlər bazasına daxil olacağımızı gözləyirik. Lakin application.properties URL-də artıq fərqli bir var - jrtb-db . Bu, docker-compose-də verilənlər bazamızın adı olacaq və bu yolla docker tətbiqimiz verilənlər bazasına daxil ola biləcək. Niyə? Buna görə də, onlar eyni docker-compose daxilində işə başlayacaq və bu şəkildə bir-birləri haqqında biləcəklər. Bu, layihə üçün bir qapalı infrastrukturumuzun olması üçün lazımdır. Bəs başlanğıcda profili necə işə salmaq olar? Bunun üçün siz Intellij IDEA-da əsas metodun işə salınmasını konfiqurasiya edə bilərsiniz. Bunun üçün konfiqurasiyaları redaktə etmək var : JavarushTelegramBotApplication-ın əsas sinfinə keçin, əsas metodun elanının yanındakı yaşıl oka basın və Run Konfiqurasiyasını dəyişdirin seçin : "A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-10 hissəLazımi dəyişənləri daxil edin və profili konfiqurasiya edin. Intellij IDEA-da bu konfiqurasiya pəncərəsinin interfeysi bir qədər dəyişdi, ona görə də mən hər kəsə IDEA-nı ən son versiyaya yeniləməyi məsləhət görürəm ki, eyni mənzərəni görək: Ətraf mühitin dəyişənləri"A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-11 hissə sahəsində biz bot adını və işarə dəyişənlərini əlavə etməliyik. aşağıdakı şablon: dəyişən_adı1=dəyər1; dəyişən_adı2=dəyər2 . Yəni açar=dəyər nöqtəli vergüllə ayrılır. Bizim vəziyyətimizdə bu belə olacaq: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (sizin bot üçün fərqli ad və nişanə sahib olacaqsınız) Sonra, Əlavə et VM variantları sahəsində : W Dəyişdirmə variantları düyməsini seçin. : -Dspring.profiles.activ =test - bu, SpringBoot-a test profilindən istifadə etməyi deyəcək, yəni xassələr application-test.properties saytından götürüləcək. Nəticədə, bu belə görünəcək: İndi biz test verilənlər bazamızı işə salırıq: docker-compose -f docker-compose-test.yml up Və məhz bu şəkildə, -d prefiksi olmadan, qeydlər dərhal görünə bilər. lazım olduqda terminal. Və son addım sadəcə əsas metodu işə salmaqdır. Hər şeyi mənim təsvir etdiyim şəkildə etsəniz, nəticədə belə olacaqsınız: Qeydlərin ikinci sətri test profilinin qazandıqlarının təsviri olacaq. Biz MySQLWorkbench-dən keçirik və miqrasiyanın baş verdiyini və hər şeyin işlədiyini yoxlamaq üçün iki əmr yerinə yetiririk (baxmayaraq ki, bu, proqramın işə salınma qeydlərindən görünsə də, mütləq yoxlamağa dəyər):"A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-12 hissə"A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-13 hissə"A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-14 hissə
  1. dev_jrtb_db istifadə edin;
  2. cədvəlləri göstərmək;
Nəticə: "A-dan Z-yə Java layihəsi": verilənlər bazası ilə əlaqəli hər şeyi əlavə etmək.  1-15 hissəGözlədiyimiz kimi, iki masa aldıq. Birincisi miqrasiyaların uçotu üçün texniki, ikincisi Telegram istifadəçiləri üçün cədvəlimizdir. Hamısı: Məlumat bazası ilə birlikdə uçuş yolu əlavə edildi. İndi yeni köçlər saat mexanizmi kimi gedəcək. Ən çətin şey prosesin ilk qurulması və işə salınmasıdır. Davam olaraq , biz bu qlobal tapşırıq üzərində işi tamamlayırıq: docker-compose.yml-ə verilənlər bazası əlavə etmək, Repozitor təbəqəsi əlavə etmək, bot üçün statistika, testlərin və sənədlərin yazılması və yenilənməsi.

Serialdakı bütün materialların siyahısı bu məqalənin əvvəlindədir.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION