JavaRush /Java blogi /Random-UZ /Biz ma'lumotlar bazasiga tegishli hamma narsani qo'shamiz...

Biz ma'lumotlar bazasiga tegishli hamma narsani qo'shamiz. (1-qism) - "Java loyihasi A dan Z gacha"

Guruhda nashr etilgan
Bosqichma-bosqich maqsadimiz sari intilyapmiz. "A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-1-qismBugun biz ko'plab vazifalarni hal qilishimiz kerak:
  1. Flyway qo'shing. Bu erda biz loyiha uchun ma'lumotlar bazasini joylashtirishni sozlaymiz.
  2. Ma'lumotlar bazasi sxemasini qo'shing.
  3. Repozitoriy qatlamini qo'shing.
  4. Bot statistikasi uchun buyruq qo'shing.
  5. Axir testlarni yozing.
Shunday qilib, orqaga o'tiring, orqaga o'tiring, uzoq o'qish bo'ladi. Biz allaqachon docker va docker-compose yordamida dasturimizni qanday joylashtirishni bilib oldik. Bu oson bo'lmadi va buni uddasidan chiqqanlarni tabriklayman. Amalga oshirish haqida savollaringiz bo'lsa, ushbu tortishish so'rovidagi kodni ko'rishingiz mumkin .

Flyway qo'shilmoqda

Flyway-ni qo'shish uchun sizda ma'lumotlar bazasi bo'lishi kerak, biz uni docker-compose-da boshqa xizmat sifatida qo'shamiz. Oxirgi marta men docker-compose-da ma'lum bir infratuzilmani, ya'ni ilovalar/ma'lumotlar bazalari/messenjerlar to'plamini qo'shish va boshqarish uchun aniq javobgar bo'lgan xizmatlar bo'limi borligini aytdim.
Men allaqachon Flyway nima ekanligini va uni SpringBoot ilovasiga qanday qo'shish haqida gapirganman . Ushbu maqolani o'qishdan oldin xotirangizni yangilashingizni maslahat beraman. Loyihaning README.md faylini Flyway + SpringBoot haqidagi maqola namoyishi bilan ham o‘qishingiz mumkin .
Biz qiladigan birinchi narsa - loyihadagi asosiy filialimizni yangilash (git pull) va vazifamiz nomi bilan yangisini yaratish - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Sizga eslatib o'taman: biz filiallarni loyihadagi vazifalar ketma-ketligini faqat nom bo'yicha saralash mumkin bo'lishi uchun o'zgartirdik. Bu sizga tezda bir qadamdan ikkinchisiga o'tish imkonini beradi. Endi siz tinchgina ishlashingiz mumkin. Biz uchta bog'liqlikni qo'shishimiz kerak:
<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>
Birinchi qaramlik FlyWay-ni loyihaga qo'shish uchun javobgardir, ikkinchisi MySQL ma'lumotlar bazasiga ulanish qobiliyatini qo'shadi. Uchinchisi - SpringBoot starter, u bahorda ma'lumotlar bazasidan foydalanishning barcha sehrlarini ishga tushiradi. Shuningdek, oluvchilar va sozlagichlarni yozmaslik uchun lombok qo'shamiz:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
Endi bizga rivojlanish uchun ma'lumotlar bazasi kerak. Biz uni hozircha ( yaxshiroq fikrga kelgunimcha ) alohida docker-compose fayli va application.properties uchun alohida fayl sifatida yaratamiz . Rivojlanishda (xususan, bahor ekotizimida) profillar kabi narsa mavjud. Profilga qarab, ishlash uchun turli xil sozlamalar ishga tushiriladi. O'ylaymanki, kelajakda biz docker-compose-ni bitta faylga birlashtiramiz va kerakli sozlamalarni ishlab chiqish uchun faqat bitta ma'lumotlar bazasi ishga tushirilishiga ishonch hosil qilamiz. Hozircha biz buni qilamiz:
  1. Keling, docker-compose-test.yml loyihasining ildizida fayl yarataylik, unda faqat o'z sozlamalariga ega ma'lumotlar bazasi ishga tushiriladi.
  2. Keling, docker-compose-test.yml faylidagi sozlamalarga mos keladigan sozlamalar bilan application-test.properties faylini yarataylik.
MySQL bilan ishlash uchun men rasmiy rasmni DockerHub’dan oldim : Tez "A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-2 qismaylanib chiqqach, kerakli o‘zgaruvchilarni topdim: MYSQL_DATABASE – ma’lumotlar bazasi nomi MYSQL_USER – ma’lumotlar bazasi foydalanuvchi nomi MYSQL_PASSWORD – ma’lumotlar bazasi foydalanuvchisi paroli Va ularni qanday qilib to‘g‘ri yozish kerak:
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
Shundan so'ng, men loyiha ildizida docker-compose-test.yml ni yarataman:
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 bilan ishlash uchun ushbu faylni ishga tushirish uchun so'rovda -f bayrog'idan foydalanishingiz kerak . Bu standart docker-compose.yml fayli emas, balki ishga tushirilgan fayl nomi taqdim etilishini anglatadi. Shuning uchun so'rov quyidagicha bo'ladi: docker-compose -f docker-compose-test.yml up -d Ma'lum bo'lishicha, avval qaysi faylni olish kerakligini aytamiz ( -f docker-compose-test.yml ), keyin esa biz biz xizmatlarni ko'tarishimiz va buni demon rejimida qilishimiz kerakligini ayting ( up -d ) - ya'ni jarayon ushbu buyruq ishga tushirilgan terminal seansidan tashqarida ishlashi uchun. Biz ishga tushiramiz va ma'lumotlar bazasi yoqilganligiga va foydalanish mumkinligiga ishonch hosil qilish uchun unga ulanishga harakat qilamiz. Buning uchun tanish MySQL Workbench-ni oching ( bu erda biz bu haqda gaplashdik ) va yangi ulanishni yarating: "A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-3 qismBiz quyidagi maydonlarni to'ldirishimiz kerak:
  • Ulanish nomi - ulanish nomi - ixtiyoriy, DEV_JRTB_DB;
  • Xost nomi - bu erda ma'lumotlar bazasi joylashtirilgan manzil. Bizning holatda, hamma narsa avvalgidek qoladi: 127.0.0.1 yoki localhost;
  • foydalanuvchi nomi - bu erda root bo'ladi, biz docker-composada yozganmiz;
  • parol - shuningdek root.
Shundan so'ng, ulanishning ishlashini tekshirishingiz kerak. Buning uchun bosing Ulanishni sinab ko'ring : "A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-4 qismNatijada biz quyidagilarni olamiz: MySQL ga ulanish muvaffaqiyatsiz tugadi... Nima uchun? Biz terminalga boramiz va docker konteyneriga nima bo'lganini ko'ramiz. Terminalga yozamiz: "A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-5 qismTerminal 59 daqiqa oldin yaratilganligini va qayta ishga tushirish 55 soniya bo'lganini ko'ramiz... nima uchun? Bu aniq emas, siz jurnallarga qarashingiz kerak. Terminaldagi loyiha ildiziga o'ting va quyidagi buyruqni bajaring: docker-compose -f docker-compose-test.yml logs
Biz olamiz:

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

Endi ma'lumotlar bazasi hech qachon bizning sozlamalarimiz bilan boshlanmagani aniq. Xato bir xil, shuning uchun uni varaqdan ajratamiz:
2021-02-28 11:03:37+00:00 [XATO] [Kirish nuqtasi]: Ma'lumotlar bazasi ishga tushirilmagan va parol opsiyasi ko'rsatilmagan dev-jrtb-db | MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD va MYSQL_RANDOM_ROOT_PASSWORD dan birini belgilashingiz kerak
Ya'ni, u asosiy foydalanuvchi - asosiy foydalanuvchi uchun parolni aniqlashi kerak. OK, endi biz faylimizni yangilaymiz:
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 ushbu o'zgaruvchilarni foydalanuvchi va parol uchun olib tashladik va faqat root foydalanuvchi uchun parolni qo'shdik. Bu shuni anglatadiki, ildiz foydalanuvchi endi root paroliga ega bo'ladi. Hech bo'lmaganda biz shunday deb taxmin qilamiz. Endi uni ishga tushiramiz va nima bo'lishini ko'ramiz: docker-compose -f docker-compose-test.yml up -d Va darhol jurnallar bizga nima deyishini ko'ring: docker-compose -f docker-compose-test.yml jurnallari
Keling, qaraylik:

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.

Endi hech qanday xatolik yo'qdek tuyuladi, shuning uchun siz kirish imkoniyatini ko'rishingiz mumkin. Ammo, afsuski, yana kirish imkoni yo'q ... Hech narsa: biz buni yanada aniqlaymiz! "A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-6 qismDocker-compose-ni tugatish va barcha konteynerlarni o'chirish uchun quyidagilarni yozishingiz kerak: docker-compose -f docker-compose-test.yml pastga Bu yerda biz o'chirish uchun faylni belgilab oldik. Nima qilish kerak? Keling, Google'da qidiramiz: ehtimol kimdir buni yaxshiroq qilgan. Eng oddiy so'rov: "docker-compose-dagi MySQL misoli" bizga o'rta resursga havolani topishga yordam beradi. Ular bu misolni keltiradilar:
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 uni ehtiyojlarimizga moslashtiramiz va olamiz:
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 ushbu parametrni bizga allaqachon ma'lum bo'lgan buyruq bilan ishga tushiramiz: docker-compose -f docker-compose-test.yml up -d Biz MySQLWorkBench orqali ma'lumotlar bazasiga kirishga yana urinib ko'ramiz: "A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-7 qismNihoyat, kirish paydo bo'ldi. Ammo endi bunga nima ta'sir qilganiga hayronman. Men bu qismda gunoh qilaman:
expose:
   # Opens port 3306 on the container
   - '3306'
Tekshirish oson: busiz hech narsa ishlamasligi kerak: D. Keling, tekshirib ko'ramiz: bu qismni o'chirib tashlang, docker-compose-ni qayta ishga tushiring: docker-compose -f docker-compose-test.yml pastga docker-compose -f docker-compose-test.yml up Ma'lumotlar bazasiga ish stoli orqali kirishga harakat qilamiz: hammasi yaxshi . Keyin yagona variant - ma'lumotlar bazasi versiyasi. Unda aniq 5.7 ko'rsatilgan, ya'ni agar siz uni eng so'nggisiga o'zgartirsangiz, u ishlamasligi kerak. Men uni qayta ishga tushirdim - va u haqiqatan ham ishlamayapti ... "A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-8 qismKo'rinishidan, ular so'nggi versiyada docker tasviri bilan bog'liq ba'zi muammolarga ega. Yaxshi, muammo yo'q. Bu ko'pincha bepul dasturiy ta'minot bilan sodir bo'ladi. Biz 5.7 versiyasidan foydalanamiz. Keling, bizga kerak bo'lgan ma'lumotlar bazasi mavjudligini ko'rib chiqaylik - dev_jrtb_db. Buning uchun MySQL Workbench da Query buyrug'ini bajaring MA'LUMOTLAR BAZALARINI SHOW : "A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-9-qismHa, u chiqishda mavjud. Ajoyib, biz davom etishimiz mumkin. Keyin, birinchi migratsiyamizni qo'shamiz. "Loyihani rejalashtirish: ikki marta o'lchab, bir marta kesib oling" maqolasidagi vazifalarga asoslanib , biz tg_user birinchi jadvalimizni yaratamiz. Barcha migratsiyalar projectDir/src/main/resources/db/migration papkasida joylashgan bo'ladi va nomi: V00001__add_tg_user_table.sql . Nima uchun bu papkada bunday nom bor - men buni Bahor + flyway haqidagi maqolada tasvirlab berganman. Bizning birinchi migratsiyamiz shunday ko'rinadi: 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
);
Ya'ni, bu erda biz shunchaki chat identifikatori (jadvalda ID sifatida ishlash uchun ishlatilishi mumkin bo'lgan noyob element) va uning holati - faol yoki faol bo'lmagan foydalanuvchi jadvalini yaratamiz. Shunday qilib, agar bot to'xtatilsa, obuna ma'lumotlari qoladi va agar ular botdan qayta foydalanishni xohlasalar foydalanishlari mumkin. Hozircha foydalanuvchi haqida boshqa ma'lumotlar kerak emas. Endi asosiy savol: buni qanday tekshirish mumkin? Biz ilovamizni ishga tushirishimiz kerak. Hozircha asosiy docker-compose.yml faylining ma'lumotlar bazasi bilan aloqasi yo'q, shuningdek, dasturni ma'lumotlar bazasi bilan birga disk raskadrovka qilishni ham o'rganishimiz kerak. Shuning uchun, Intellij IDEA bilan dasturni ishga tushiramiz. Buni sinab ko'rish uchun biz JavarushTelegramBotApplication-da asosiy usulimizni ishga tushirishimiz kerak. Joylashtirish va sinovdan o'tkazish ishlarini ajratish uchun biz xususiyatlarga ega boshqa fayldan foydalanamiz - application-test.properties . Ushbu shablon yordamida biz Bahorga ushbu fayl test profili uchun ishlatilishini bildiramiz . Agar biz profilni ko'rsatmasak, standart profil ishlatiladi (SpringBoot-ni ishga tushirishda buni jurnallaringizda tekshiring: bu haqda birinchi qatorlarda yoziladi). Bu shunday ko'rinadi:
# 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
Va asosiy application.properties biroz boshqacha ko'rinadi:
# 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
Muhim farq spring.datasource.url maydonida: test profilida biz localhost da URL manziliga egamiz . Ya'ni, ilova Docker-dan tashqarida ishlashi kutilmoqda, bu haqiqat, chunki disk raskadrovka paytida biz loyihamizni Intellij IDEA-da ishga tushiramiz va mahalliy mashinadan ma'lumotlar bazasiga kirishimiz mumkinligini kutamiz. Ammo application.properties URL manzilida allaqachon boshqasi mavjud - jrtb-db . Bu bizning docker-compose-dagi ma'lumotlar bazasi nomi bo'ladi va shu tarzda bizning docker ilovamiz ma'lumotlar bazasiga kirishi mumkin bo'ladi. Nega? Shuning uchun ular bir xil docker-compose ichida ishga tushadilar va shu tarzda bir-birlari haqida bilishadi. Bu loyiha uchun bitta yopiq infratuzilmaga ega bo'lishimiz uchun zarur. Ammo profilni ishga tushirishda qanday boshlash kerak? Buning uchun siz Intellij IDEA-da asosiy usulni ishga tushirishni sozlashingiz mumkin. Buning uchun Konfiguratsiyalarni tahrirlash mavjud : JavarushTelegramBotApplication-ning asosiy sinfiga o'ting, asosiy usul deklaratsiyasi yonidagi yashil o'qni bosing va "Ishga tushirish konfiguratsiyasini o'zgartirish" -ni tanlang : "A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-10-qismKerakli o'zgaruvchilarni kiriting va profilni sozlang. Intellij IDEA-da ushbu konfiguratsiya oynasining interfeysi biroz o'zgardi, shuning uchun men hammaga IDEA-ni so'nggi versiyaga yangilashni maslahat beraman, shunda biz bir xil rasmni ko'ramiz: Atrof-muhit o'zgaruvchilari"A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-11-qism maydoniga biz bot nomini va token o'zgaruvchilarini qo'shishimiz kerak. quyidagi shablon: o'zgaruvchi_nomi1=qiymat1; o'zgaruvchi_nomi2=qiymat2 . Ya'ni, key=value nuqtali vergul bilan ajratiladi. Bizning holatimizda u shunday bo'ladi: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (sizda bot uchun boshqa nom va token bo'ladi) Keyin, "V. O'zgartirish" opsiyalaridagi "VM qo'shish imkoniyatlari" maydonini tanlang . : -Dspring.profiles.activ =test - bu SpringBoot-ga test profilidan foydalanishni aytadi, ya'ni xususiyatlar application-test.properties dan olinadi. Natijada, u quyidagicha ko'rinadi: Endi biz test ma'lumotlar bazasini ishga tushiramiz: docker-compose -f docker-compose-test.yml up Va aynan shu tarzda, -d prefiksisiz, jurnallarni darhol ko'rish mumkin bo'ladi. agar kerak bo'lsa, terminal. Va oxirgi qadam oddiygina asosiy usulni ishga tushirishdir. Agar siz hamma narsani men ta'riflaganimdek qilsangiz, siz shunday bo'lasiz: Jurnallarning ikkinchi qatori test profili nima topganligining tavsifi bo'ladi. Biz MySQLWorkbench orqali o'tamiz va migratsiya boshlanganini va hamma narsa ishlayotganini tekshirish uchun ikkita buyruqni bajaramiz (garchi bu ilovani ishga tushirish jurnallarida ko'rinsa ham, buni tekshirishga arziydi):"A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-12-qism"A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-13-qism"A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-14-qism
  1. dev_jrtb_db dan foydalaning;
  2. jadvallarni ko'rsatish;
Natija: "A dan Zgacha Java loyihasi": ma'lumotlar bazasiga tegishli hamma narsani qo'shish.  1-15-qismKutganimizdek, ikkita stol oldik. Birinchisi, migratsiyani hisobga olish uchun texnik, ikkinchisi Telegram foydalanuvchilari uchun jadvalimiz. Hammasi: Flyway ma'lumotlar bazasi bilan birga qo'shildi. Endi yangi migratsiyalar soat mexanizmi kabi ketadi. Eng qiyin narsa - jarayonni birinchi sozlash va ishga tushirish. Davomida biz ushbu global vazifa ustida ishni yakunlamoqdamiz: docker-compose.yml-ga ma'lumotlar bazalarini qo'shish, Repozitoriy qatlamini qo'shish, bot uchun statistika, testlar va hujjatlarni yozish va yangilash.

Seriyadagi barcha materiallar ro'yxati ushbu maqolaning boshida.

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