JavaRush /جاوا بلاگ /Random-UR /ہم ڈیٹا بیس سے متعلق ہر چیز کو شامل کرتے ہیں۔ (حصہ 1) - "...

ہم ڈیٹا بیس سے متعلق ہر چیز کو شامل کرتے ہیں۔ (حصہ 1) - "A سے Z تک جاوا پروجیکٹ"

گروپ میں شائع ہوا۔
قدم بہ قدم ہم اپنے مقصد کی طرف بڑھ رہے ہیں۔ "A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 1آج ہمیں بہت سے کاموں کو حل کرنے کی ضرورت ہے:
  1. فلائی وے شامل کریں۔ یہاں ہم پروجیکٹ کے لیے ڈیٹا بیس کی تعیناتی کو ترتیب دیں گے۔
  2. ڈیٹا بیس اسکیما شامل کریں۔
  3. ایک ذخیرہ کی پرت شامل کریں۔
  4. بوٹ کے اعدادوشمار کے لیے ایک کمانڈ شامل کریں۔
  5. سب کے بعد، ٹیسٹ لکھیں.
تو بیٹھ جاؤ، بیٹھ جاؤ، ایک طویل پڑھا جائے گا. ہم پہلے ہی سیکھ چکے ہیں کہ ڈوکر اور ڈوکر کمپوز کا استعمال کرتے ہوئے اپنی ایپلیکیشن کو کیسے تعینات کیا جائے ۔ یہ آسان نہیں تھا، اور ان لوگوں کو مبارک ہو جنہوں نے اسے کیا. اگر آپ کے نفاذ کے بارے میں کوئی سوال ہے تو، آپ اس پل کی درخواست میں کوڈ کو دیکھ سکتے ہیں ۔

فلائی وے کو شامل کرنا

Flyway کو شامل کرنے کے لیے، آپ کے پاس ایک ڈیٹا بیس ہونا ضروری ہے، جسے ہم docker-compose میں ایک اور سروس کے طور پر شامل کریں گے۔ پچھلی بار میں نے کہا تھا کہ docker-compose میں ایک سروسز سیکشن ہوتا ہے، جو کسی خاص انفراسٹرکچر کو شامل کرنے اور اس کا انتظام کرنے کے لیے بالکل ذمہ دار ہوتا ہے - یعنی ایپلیکیشنز/ڈیٹا بیسز/میسینجرز وغیرہ کا ایک سیٹ۔
میں پہلے ہی اس بارے میں بات کر چکا ہوں کہ فلائی وے کیا ہے اور اسے اسپرنگ بوٹ ایپلی کیشن میں کیسے شامل کیا جائے ۔ میں آپ کو مشورہ دیتا ہوں کہ اس مضمون کو پڑھنے سے پہلے اپنی یادداشت کو تازہ کر لیں۔ آپ Flyway + SpringBoot کے بارے میں مضمون کے مظاہرے کے ساتھ پروجیکٹ کی README.md فائل بھی پڑھ سکتے ہیں۔
سب سے پہلا کام جو ہم کرتے ہیں وہ ہے پروجیکٹ میں اپنی مرکزی برانچ کو اپ ڈیٹ کریں (گٹ پل) اور اپنے ٹاسک کے نام کے ساتھ ایک نیا بنائیں - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1)۔ میں آپ کو یاد دلاتا ہوں: ہم نے شاخوں کا نام بدل دیا تاکہ پروجیکٹ میں کاموں کی ترتیب کو صرف نام سے ترتیب دیا جا سکے۔ یہ آپ کو تیزی سے ایک قدم سے دوسرے قدم پر جانے کی اجازت دے گا۔ اب آپ سکون سے کام کر سکتے ہیں۔ ہمیں تین انحصار شامل کرنے کی ضرورت ہے:
<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>
پہلا انحصار FlyWay کو پروجیکٹ میں شامل کرنے کے لیے ذمہ دار ہے، دوسرا MySQL ڈیٹا بیس سے منسلک ہونے کی صلاحیت کو شامل کرتا ہے۔ تیسرا اسپرنگ بوٹ اسٹارٹر ہے، جو اسپرنگ میں ڈیٹا بیس کے استعمال کے تمام جادو کا آغاز کرتا ہے۔ اور آئیے ایک لومبوک بھی شامل کریں تاکہ گیٹرز اور سیٹٹرز نہ لکھیں:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
اب ہمیں ترقی کے لیے ایک ڈیٹا بیس کی ضرورت ہے۔ ہم اسے ابھی کے لیے بنائیں گے ( جب تک کہ میں کوئی بہتر آئیڈیا نہ لے آؤں ) ایک علیحدہ docker-compose فائل اور application.properties کے لیے علیحدہ فائل کے طور پر۔ ترقی میں ایسی چیز ہے (اور خاص طور پر بہار کے ماحولیاتی نظام میں) پروفائلز کے طور پر۔ پروفائل پر منحصر ہے، آپریشن کے لئے مختلف ترتیبات شروع کی جاتی ہیں. میرے خیال میں مستقبل میں ہم docker-compose کو ایک فائل میں جوڑیں گے اور اس بات کو یقینی بنائیں گے کہ صرف ایک ڈیٹا بیس کو ان سیٹنگز پر ڈیولپمنٹ کے لیے لانچ کیا گیا ہے جن کی ہمیں ضرورت ہے۔ ابھی کے لیے ہم یہ کریں گے:
  1. آئیے پروجیکٹ docker-compose-test.yml کے روٹ میں ایک فائل بنائیں، جس میں صرف اس کی اپنی سیٹنگز والا ڈیٹا بیس لانچ کیا جائے گا۔
  2. آئیے ایک application-test.properties فائل بنائیں سیٹنگز کے ساتھ جو docker-compose-test.yml فائل کی سیٹنگز سے مماثل ہو۔
MySQL کے ساتھ کام کرنے کے لیے، میں نے DockerHub سے آفیشل امیج لی : "A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 2جلدی سے اسکرول کرنے کے بعد، مجھے ضروری متغیرات ملے: MYSQL_DATABASE - ڈیٹا بیس کا نام MYSQL_USER - ڈیٹا بیس صارف کا نام MYSQL_PASSWORD - ڈیٹا بیس صارف کا پاس ورڈ اور انہیں صحیح طریقے سے کیسے لکھنے کی ضرورت ہے:
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-test.yml بناتا ہوں:
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 کے ساتھ کام کرنے کے لیے اس مخصوص فائل کو چلانے کے لیے، آپ کو درخواست میں -f پرچم استعمال کرنے کی ضرورت ہے ۔ اس کا مطلب یہ ہے کہ جو فائل لانچ کی جائے گی اس کا نام فراہم کیا جائے گا، بجائے اس کے کہ معیاری docker-compose.yml لیا جائے۔ لہذا، درخواست اس طرح نظر آئے گی: docker-compose -f docker-compose-test.yml up -d اس سے پتہ چلتا ہے کہ پہلے ہم کہتے ہیں کہ کون سی فائل لینا ہے ( -f docker-compose-test.yml )، اور پھر ہم کہتے ہیں کہ ہمیں خدمات کو بڑھانے اور اسے ڈیمون موڈ ( up -d ) میں کرنے کی ضرورت ہے - یعنی یہ عمل ٹرمینل سیشن سے باہر چلے جس میں یہ کمانڈ شروع کی گئی تھی۔ ہم لانچ کرتے ہیں اور ڈیٹا بیس سے جڑنے کی کوشش کرتے ہیں تاکہ یہ یقینی بنایا جا سکے کہ یہ تیار ہے اور اسے استعمال کیا جا سکتا ہے۔ ایسا کرنے کے لیے، واقف MySQL ورک بینچ کھولیں ( یہاں ہم نے اس کے بارے میں بات کی ہے ) اور ایک نیا کنکشن بنائیں: "A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 3ہمیں درج ذیل فیلڈز کو پُر کرنے کی ضرورت ہے:
  • کنکشن کا نام - کنکشن کا نام - اختیاری طور پر، DEV_JRTB_DB؛
  • میزبان نام - یہ وہ پتہ ہے جہاں ڈیٹابیس تعینات ہے۔ ہمارے معاملے میں، سب کچھ ویسا ہی رہے گا جیسا کہ تھا: 127.0.0.1 ، یا localhost؛
  • صارف نام - یہاں روٹ ہوگا، جیسا کہ ہم نے docker-compose میں لکھا ہے۔
  • پاس ورڈ - بھی جڑ.
اس کے بعد، آپ کو چیک کرنے کی ضرورت ہے کہ آیا کنکشن کام کرے گا. ایسا کرنے کے لیے، ٹیسٹ کنکشن پر کلک کریں : "A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 4نتیجے کے طور پر، ہمیں ملتا ہے: MySQL سے جڑنے میں ناکام... کیوں؟ ہم ٹرمینل پر جاتے ہیں اور دیکھتے ہیں کہ ڈوکر کنٹینر کا کیا ہوا۔ آئیے ٹرمینل میں لکھتے ہیں: "A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 5ہم دیکھتے ہیں کہ ٹرمینل 59 منٹ پہلے بنایا گیا تھا، اور دوبارہ شروع ہونے کا وقت 55 سیکنڈ تھا... کیوں؟ یہ واضح نہیں ہے، آپ کو نوشتہ جات کو دیکھنے کی ضرورت ہے۔ ٹرمینل میں پروجیکٹ روٹ پر جائیں اور درج ذیل کمانڈ کو چلائیں: docker-compose -f docker-compose-test.yml logs
ہم حاصل:

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

اب یہ واضح ہے کہ ڈیٹا بیس ہماری ترتیبات کے ساتھ کبھی شروع نہیں ہوا۔ غلطی ایک جیسی ہے، تو آئیے اسے شیٹ سے الگ کر دیں:
2021-02-28 11:03:37+00:00 [ERROR] [انٹری پوائنٹ]: ڈیٹا بیس غیر شروع کیا گیا ہے اور پاس ورڈ کا آپشن متعین نہیں ہے dev-jrtb-db | آپ کو MYSQL_ROOT_PASSWORD، MYSQL_ALLOW_EMPTY_PASSWORD اور MYSQL_RANDOM_ROOT_PASSWORD میں سے ایک کی وضاحت کرنے کی ضرورت ہے
یعنی، اسے روٹ صارف - مرکزی صارف کے لیے پاس ورڈ کا تعین کرنے کی ضرورت ہے۔ ٹھیک ہے، اب ہم اپنی فائل کو اپ ڈیٹ کریں گے:
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
ہم نے صارف اور پاس ورڈ کے لیے ان متغیرات کو ہٹا دیا اور صرف روٹ صارف کے لیے پاس ورڈ شامل کیا۔ اس کا مطلب ہے کہ روٹ صارف کے پاس اب روٹ پاس ورڈ ہوگا۔ کم از کم ہم یہی سمجھتے ہیں۔ اب آئیے اسے چلاتے ہیں اور دیکھتے ہیں کہ کیا ہوتا ہے: docker-compose -f docker-compose-test.yml up -d اور فوری طور پر دیکھیں کہ لاگز ہمیں کیا بتاتے ہیں: docker-compose -f docker-compose-test.yml لاگز
آئیں دیکھیں:

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.

ایسا لگتا ہے کہ اب کوئی خرابی نہیں ہے، لہذا آپ دیکھ سکتے ہیں کہ آیا وہاں رسائی ہوگی۔ لیکن، بدقسمتی سے، دوبارہ کوئی رسائی نہیں ہے... کچھ نہیں: ہم اس کا مزید پتہ لگائیں گے! "A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 6docker-compose کو ختم کرنے اور تمام کنٹینرز کو حذف کرنے کے لیے، آپ کو لکھنا ہوگا: docker-compose -f docker-compose-test.yml down یہاں ہم نے فائل کو حذف کرنے کی وضاحت کی ہے۔ کیا کرنا ہے؟ آئیے اسے گوگل کریں: شاید کسی نے اسے بہتر کیا ہو۔ آسان ترین استفسار: "ڈاکر کمپوز میں mysql کی مثال" ہمیں درمیانے وسائل کا لنک تلاش کرنے میں مدد کرتا ہے۔ وہ یہ مثال دیتے ہیں:
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:
ہم اسے اپنی ضروریات کے مطابق ڈھالتے ہیں اور حاصل کرتے ہیں:
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'
ہم اس آپشن کو اس کمانڈ کے ساتھ لانچ کرتے ہیں جو ہمیں پہلے سے معلوم ہے: docker-compose -f docker-compose-test.yml up -d ہم MySQLWorkBench کے ذریعے ڈیٹا بیس تک رسائی کی دوبارہ کوشش کرتے ہیں: "A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 7آخر کار، رسائی ظاہر ہو گئی۔ لیکن اب میں حیران ہوں کہ اس پر کیا اثر پڑا۔ میں اس حصے پر گناہ کر رہا ہوں:
expose:
   # Opens port 3306 on the container
   - '3306'
یہ چیک کرنا آسان ہے: اس کے بغیر، کچھ بھی کام نہیں کرنا چاہئے: ڈی۔ آئیے چیک کریں: اس حصے کو حذف کریں، docker-compose کو دوبارہ شروع کریں: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up ہم ورک بینچ کے ذریعے ڈیٹا بیس میں لاگ ان کرنے کی کوشش کرتے ہیں: سب کچھ کام کرتا ہے۔ . پھر واحد آپشن ڈیٹا بیس ورژن ہے۔ یہ واضح طور پر 5.7 بتاتا ہے، یعنی اگر آپ اسے تازہ ترین میں تبدیل کرتے ہیں، تو اسے کام نہیں کرنا چاہیے۔ میں نے اسے دوبارہ شروع کیا - اور یہ واقعی کام نہیں کرتا ہے... "A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 8بظاہر، انہیں تازہ ترین ورژن پر ڈوکر امیج کے ساتھ کچھ مسائل ہیں۔ ٹھیک ہے کوئی مسئلہ نہیں. یہ اکثر مفت سافٹ ویئر کے ساتھ ہوتا ہے۔ ہم ورژن 5.7 استعمال کریں گے۔ آئیے دیکھتے ہیں کہ کیا کوئی ڈیٹا بیس ہے جس کی ہمیں ضرورت ہے - dev_jrtb_db۔ ایسا کرنے کے لیے، MySQL ورک بینچ شو ڈیٹا بیس میں Query کمانڈ چلائیں : "A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 9ہاں، یہ آؤٹ پٹ میں موجود ہے۔ بہت اچھا، ہم آگے بڑھ سکتے ہیں۔ اگلا، آئیے اپنی پہلی منتقلی شامل کریں۔ مضمون "پروجیکٹ پلاننگ: دو بار پیمائش، ایک بار کاٹ" کے کاموں کی بنیاد پر ہم اپنا پہلا ٹیبل tg_user بنائیں گے۔ تمام ہجرتیں projectDir/src/main/resources/db/migration فولڈر میں ہوں گی ، اور نام یہ ہوگا: V00001__add_tg_user_table.sql ۔ اس فولڈر میں ایسا نام کیوں ہے - میں نے اسے بہار + فلائی وے کے بارے میں مضمون میں بیان کیا ہے۔ ہماری پہلی منتقلی اس طرح نظر آئے گی: 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
);
یعنی، یہاں ہم صرف ایک صارف کا ٹیبل بناتے ہیں جس کے پاس صرف ایک چیٹ آئی ڈی ہے (ایک منفرد عنصر جو ٹیبل میں آئی ڈی کے طور پر کام کرنے کے لیے استعمال کیا جا سکتا ہے) اور اس کی حالت - فعال یا غیر فعال۔ لہذا، اگر بوٹ کو روک دیا جاتا ہے، تو سبسکرپشن کی معلومات باقی رہے گی اور اگر وہ بوٹ کو دوبارہ استعمال کرنا چاہیں تو استعمال کیا جا سکتا ہے۔ فی الحال صارف کے بارے میں کسی اور معلومات کی ضرورت نہیں ہے۔ اب اہم سوال: اسے کیسے چیک کریں؟ ہمیں اپنی درخواست شروع کرنے کی ضرورت ہے۔ ابھی تک، مرکزی docker-compose.yml فائل کا ڈیٹا بیس سے کوئی تعلق نہیں ہے، اور ہمیں یہ بھی سیکھنے کی ضرورت ہے کہ ڈیٹا بیس کے ساتھ ایپلیکیشن کو ڈیبگ کیسے کیا جائے۔ لہذا، آئیے انٹیلیج آئی ڈی ای اے کے ساتھ ایپلیکیشن لانچ کریں۔ اس کو جانچنے کے لیے ہمیں JavarushTelegramBotApplication میں اپنا بنیادی طریقہ چلانے کی ضرورت ہوگی۔ تعیناتی اور جانچ کے کام کو الگ کرنے کے لیے، ہم پراپرٹیز کے ساتھ ایک اور فائل استعمال کریں گے - application-test.properties ۔ اس ٹیمپلیٹ کے ساتھ ہم اسپرنگ کو بتاتے ہیں کہ یہ فائل ٹیسٹ پروفائل کے لیے استعمال کی جائے گی ۔ جب ہم کسی پروفائل کی وضاحت نہیں کرتے ہیں تو پہلے سے طے شدہ پروفائل استعمال کیا جاتا ہے (اسپرنگ بوٹ چلاتے وقت اسے اپنے لاگ میں چیک کریں: اس کے بارے میں پہلی سطروں میں لکھا جائے گا)۔ یہ ایسا نظر آئے گا:
# 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
اور مین application.properties قدرے مختلف نظر آئیں گے:
# 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
اہم فرق spring.datasource.url فیلڈ میں ہے: ٹیسٹ پروفائل میں ہمارے پاس لوکل ہوسٹ پر ایک URL ہے ۔ یعنی، ایپلی کیشن کے Docker سے باہر چلنے کی توقع ہے، جو کہ درست ہے، کیونکہ ڈیبگنگ کرتے وقت ہم Intellij IDEA میں اپنا پروجیکٹ چلائیں گے اور توقع کریں گے کہ ہمیں مقامی مشین سے ڈیٹا بیس تک رسائی حاصل ہوگی۔ لیکن application.properties URL پہلے سے ہی ایک مختلف پر مشتمل ہے - jrtb-db ۔ یہ docker-compose میں ہمارے ڈیٹا بیس کا نام ہوگا، اور اس طرح ہماری docker ایپلی کیشن ڈیٹا بیس تک پہنچ سکے گی۔ کیوں؟ لہذا، وہ ایک ہی ڈاکر کمپوز میں لانچ کریں گے اور اس طرح ایک دوسرے کے بارے میں جانیں گے۔ یہ ضروری ہے تاکہ ہمارے پاس پروجیکٹ کے لیے ایک بند انفراسٹرکچر ہو۔ لیکن اسٹارٹ اپ پر پروفائل کو کیسے لانچ کیا جائے؟ ایسا کرنے کے لیے، آپ Intellij IDEA میں مرکزی طریقہ کے آغاز کو ترتیب دے سکتے ہیں۔ اس کے لیے ایڈیٹ کنفیگریشنز موجود ہیں : JavarushTelegramBotApplication کی مین کلاس میں جائیں، مین طریقہ کے اعلان کے آگے سبز تیر پر کلک کریں اور Modify Run Configuration کو منتخب کریں : "A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 10ضروری متغیرات درج کریں اور پروفائل کو کنفیگر کریں۔ Intellij IDEA میں، اس کنفیگریشن ونڈو کا انٹرفیس تھوڑا سا تبدیل ہوا ہے، اس لیے میں سب کو مشورہ دیتا ہوں کہ IDEA کو تازہ ترین ورژن میں اپ ڈیٹ کریں تاکہ ہمیں وہی تصویر نظر آئے: Environment variables"A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 11 کے فیلڈ میں ، ہمیں بوٹ کا نام اور ٹوکن متغیرات شامل کرنے کی ضرورت ہے۔ درج ذیل ٹیمپلیٹ: variable_name1=value1؛ variable_name2=value2 ۔ یعنی، key=value کو سیمیکولنز سے الگ کیا جاتا ہے۔ ہمارے معاملے میں یہ اس طرح ہوگا: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (آپ کے پاس ایک مختلف نام اور بوٹ کا ٹوکن ہوگا) اس کے بعد، Write میں ترمیم کریں بٹن میں شامل VM آپشنز فیلڈ کو منتخب کریں ۔ : -Dspring.profiles.active =test - یہ SpringBoot کو ٹیسٹ پروفائل استعمال کرنے کے لیے کہے گا، جس کا مطلب ہے کہ پراپرٹیز application-test.properties سے لی جائیں گی۔ نتیجے کے طور پر، یہ اس طرح نظر آئے گا: اب ہم اپنا ٹیسٹ ڈیٹا بیس لانچ کرتے ہیں: docker-compose -f docker-compose-test.yml up اور بالکل اسی طرح، -d سابقہ ​​کے بغیر، تاکہ لاگز کو فوری طور پر دیکھا جا سکے۔ ٹرمینل، اگر کوئی ضرورت ہو. اور آخری مرحلہ صرف مرکزی طریقہ کو چلانا ہے۔ اگر آپ سب کچھ اسی طرح کرتے ہیں جیسا کہ میں نے بیان کیا ہے، تو آپ اس کے ساتھ ختم ہوں گے: لاگز کی دوسری لائن اس بات کی تفصیل ہوگی کہ ٹیسٹ پروفائل نے کیا کمایا ہے۔ ہم MySQLWorkbench سے گزرتے ہیں اور یہ چیک کرنے کے لیے دو کمانڈ چلاتے ہیں کہ ہجرت ختم ہو گئی ہے اور سب کچھ کام کر رہا ہے (اگرچہ یہ ایپلیکیشن لانچ لاگز سے نظر آتا ہے، یہ یقینی طور پر چیک کرنے کے قابل ہے):"A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 12"A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 13"A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 14
  1. dev_jrtb_db استعمال کریں؛
  2. میزیں دکھائیں؛
نتیجہ: "A سے Z تک جاوا پروجیکٹ": ڈیٹا بیس سے متعلق ہر چیز کو شامل کرنا۔  حصہ 1 - 15جیسا کہ ہماری توقع تھی، ہمیں دو میزیں ملیں۔ پہلا ہجرت کے حساب کتاب کے لیے تکنیکی ہے، دوسرا ٹیلیگرام صارفین کے لیے ہماری میز ہے۔ تمام: ڈیٹا بیس کے ساتھ فلائی وے کو شامل کیا گیا ہے۔ اب نئی ہجرتیں گھڑی کے کام کی طرح ہوں گی۔ سب سے مشکل چیز اس عمل کا پہلا سیٹ اپ اور لانچ ہے۔ تسلسل میں ، ہم اس عالمی کام پر کام مکمل کر رہے ہیں: docker-compose.yml میں ڈیٹا بیسز کا اضافہ، ریپوزٹری پرت کا اضافہ، بوٹ کے لیے اعداد و شمار، ٹیسٹ اور دستاویزات لکھنا اور اپ ڈیٹ کرنا۔

سیریز کے تمام مواد کی فہرست اس مضمون کے شروع میں ہے۔

تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION