خطوة بخطوة نتحرك نحو هدفنا. اليوم نحن بحاجة إلى حل العديد من المهام:
أول شيء نقوم به هو تحديث فرعنا الرئيسي في المشروع (git pull) وإنشاء فرع جديد باسم مهمتنا - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). اسمحوا لي أن أذكرك: قمنا بإعادة تسمية الفروع بحيث يكون من الممكن فرز تسلسل المهام في المشروع بالاسم فقط. سيسمح لك ذلك بالانتقال بسرعة من خطوة إلى أخرى. الآن يمكنك العمل بسلام. نحن بحاجة إلى إضافة ثلاث تبعيات:
من الواضح الآن أن قاعدة البيانات لم تبدأ بإعداداتنا مطلقًا. الخطأ هو نفسه، لذلك دعونا نعزله عن الورقة:
يبدو أنه لم تعد هناك أخطاء، لذا يمكنك معرفة ما إذا كان سيكون هناك إمكانية الوصول. ولكن، لسوء الحظ، لا يمكن الوصول مرة أخرى... لا شيء: سنكتشف الأمر أكثر! لإنهاء docker-compose وحذف جميع الحاويات، تحتاج إلى كتابة: docker-compose -f docker-compose-test.yml لأسفل هنا حددنا الملف المراد حذفه. ما يجب القيام به؟ دعنا نبحث عنها في جوجل: ربما قام شخص ما بذلك بشكل أفضل. أبسط استعلام: "مثال على mysql في docker-compose" يساعدنا في العثور على رابط لمورد متوسط. ويضربون هذا المثال:
- أضف مسار الطيران. سنقوم هنا بتكوين نشر قاعدة البيانات للمشروع.
- إضافة مخطط قاعدة البيانات.
- أضف طبقة المستودع.
- إضافة أمر لإحصائيات الروبوت.
- اكتب الاختبارات، بعد كل شيء.
إضافة مسار الطيران
لإضافة Flyway، يجب أن يكون لديك قاعدة بيانات، والتي سنضيفها كخدمة أخرى في docker-compose. في المرة الأخيرة التي قلت فيها أن docker-compose يحتوي على قسم خدمات، وهو المسؤول على وجه التحديد عن إضافة وإدارة بنية تحتية معينة - أي مجموعة من التطبيقات/قواعد البيانات/المراسلين، وما إلى ذلك.لقد تحدثت بالفعل عن ماهية Flyway وكيفية إضافته إلى تطبيق SpringBoot . أنصحك بتحديث ذاكرتك قبل قراءة هذا المقال. يمكنك أيضًا قراءة ملف README.md الخاص بالمشروع من خلال عرض توضيحي للمقال حول Flyway + SpringBoot. |
<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. والثالث هو SpringBoot starter، الذي يطلق كل سحر استخدام قاعدة البيانات في Spring. ودعنا نضيف أيضًا lombok حتى لا نكتب حروفًا ومحددات:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
الآن نحن بحاجة إلى قاعدة بيانات للتنمية. سنقوم بإنشائه في الوقت الحالي ( حتى أتوصل إلى فكرة أفضل ) كملف إنشاء عامل إرساء منفصل وملف منفصل لـ application.properties. يوجد شيء من هذا القبيل في التطوير (وفي نظام Spring البيئي على وجه الخصوص) كملفات تعريف. اعتمادًا على ملف التعريف، يتم تشغيل إعدادات مختلفة للتشغيل. أعتقد أننا سنقوم في المستقبل بدمج docker-compose في ملف واحد والتأكد من تشغيل قاعدة بيانات واحدة فقط للتطوير على الإعدادات التي نحتاجها. في الوقت الحالي سنفعل هذا:
- لنقم بإنشاء ملف في جذر المشروع docker-compose-test.yml، حيث سيتم تشغيل قاعدة البيانات ذات الإعدادات الخاصة فقط.
- لنقم بإنشاء ملف application-test.properties بإعدادات تطابق الإعدادات الموجودة في ملف docker-compose-test.yml.
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 Workbench المألوف ( تحدثنا عنه هنا ) وقم بإنشاء اتصال جديد: نحتاج إلى ملء الحقول التالية:
- اسم الاتصال - اسم الاتصال - اختياريًا، DEV_JRTB_DB؛
- اسم المضيف - هنا هو العنوان الذي تم نشر قاعدة البيانات فيه. في حالتنا، سيبقى كل شيء كما كان: 127.0.0.1 أو المضيف المحلي؛
- اسم المستخدم - هنا سيكون الجذر، كما كتبنا في docker-compose؛
- كلمة المرور - الجذر أيضًا.
نحن نحصل:
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 [خطأ] [نقطة الإدخال]: قاعدة البيانات غير مهيأة ولم يتم تحديد خيار كلمة المرور 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 logs
دعونا ننظر:
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.
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: أخيرًا، ظهر الوصول. لكن الآن أتساءل ما الذي أثر على هذا. أنا آثم في هذا الجزء:
expose:
# Opens port 3306 on the container
- '3306'
من السهل التحقق: بدون هذا، لا شيء يجب أن يعمل :D. دعونا نتحقق: احذف هذا الجزء، أعد تشغيل docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up نحاول الدخول إلى قاعدة البيانات من خلال طاولة العمل: كل شيء على ما يرام . ثم الخيار الوحيد هو إصدار قاعدة البيانات. ينص بوضوح على 5.7، أي إذا قمت بتغييره إلى الأحدث، فلا ينبغي أن يعمل. لقد قمت بإعادة تشغيله - وهو لا يعمل حقًا... على ما يبدو، لديهم بعض المشاكل مع صورة عامل الإرساء في الإصدار الأحدث. حسنا لا مشكلة. يحدث هذا غالبًا مع البرامج المجانية. سوف نستخدم الإصدار 5.7. دعونا نرى ما إذا كانت هناك قاعدة بيانات نحتاجها - dev_jrtb_db. للقيام بذلك، قم بتشغيل أمر الاستعلام في MySQL Workbench SHOW DATABASES : نعم، إنه موجود في الإخراج. عظيم، يمكننا المضي قدما. بعد ذلك، دعونا نضيف الهجرة الأولى لدينا. بناءً على المهام الواردة في مقال "تخطيط المشروع: القياس مرتين، والقص مرة واحدة"، سنقوم بإنشاء جدولنا الأول tg_user. سيتم وضع جميع عمليات الترحيل في المجلد projectDir/src/main/resources/db/migration ، وسيكون الاسم: V00001__add_tg_user_table.sql . لماذا يوجد مثل هذا الاسم في هذا المجلد - لقد وصفته في مقال حول Spring + flyway. هذا هو الشكل الذي ستبدو عليه عملية الترحيل الأولى: 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 الرئيسي بقاعدة البيانات، ونحتاج أيضًا إلى معرفة كيفية تصحيح أخطاء التطبيق مع قاعدة البيانات. لذلك، دعونا نطلق التطبيق باستخدام Intellij IDEA. لاختبار ذلك، سنحتاج إلى تشغيل طريقتنا الرئيسية في JavarushTelegramBotApplication. للفصل بين عمل النشر والاختبار، سنستخدم ملفًا آخر له خصائص - application-test.properties . باستخدام هذا القالب، نعلم Spring أنه سيتم استخدام هذا الملف لملف تعريف الاختبار . عندما لا نحدد ملف تعريف، يتم استخدام ملف التعريف الافتراضي (تحقق من ذلك في سجلاتك عند تشغيل SpringBoot: سيتم كتابته عن هذا في الأسطر الأولى). وهذا ما سيبدو عليه:
# 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
وسوف تبدو خصائص التطبيق الرئيسية مختلفة قليلاً:
# 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 ونتوقع أنه سيكون لدينا إمكانية الوصول إلى قاعدة البيانات من الجهاز المحلي. لكن عنوان URL الخاص بالتطبيق application.properties يحتوي بالفعل على عنوان URL مختلف - jrtb-db . سيكون هذا هو اسم قاعدة البيانات الخاصة بنا في docker-compose، وبهذه الطريقة سيتمكن تطبيق الإرساء الخاص بنا من الوصول إلى قاعدة البيانات. لماذا؟ لذلك، سيتم إطلاقهما داخل نفس عامل الإرساء وسيتعرفان على بعضهما البعض بهذه الطريقة. يعد ذلك ضروريًا حتى يكون لدينا بنية تحتية واحدة مغلقة للمشروع. ولكن كيف يتم تشغيل الملف الشخصي عند بدء التشغيل؟ للقيام بذلك، يمكنك تكوين إطلاق الطريقة الرئيسية في Intellij IDEA. لهذا، هناك تحرير التكوينات : انتقل إلى الفئة الرئيسية لـ JavarushTelegramBotApplication، وانقر على السهم الأخضر بجوار إعلان الطريقة الرئيسية وحدد تعديل تشغيل التكوين : أدخل المتغيرات الضرورية وقم بتكوين ملف التعريف. في Intellij IDEA، تغيرت واجهة نافذة التكوين هذه قليلاً، لذا أنصح الجميع بتحديث IDEA إلى الإصدار الأحدث حتى نرى نفس الصورة: في حقل متغيرات البيئة ، نحتاج إلى إضافة اسم الروبوت ومتغيرات الرمز المميز باستخدام القالب التالي: variable_name1=value1;variable_name2=value2 . أي أنه يتم فصل قيمة المفتاح = القيمة بفواصل منقوطة. في حالتنا سيكون الأمر على النحو التالي: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (سيكون لديك اسمًا ورمزًا مميزًا مختلفًا للروبوت) بعد ذلك، حدد حقل خيارات Add VM في زر تعديل الخيارات : كتابة : -Dspring.profiles.active =test - هذا سيخبر SpringBoot باستخدام ملف تعريف الاختبار، مما يعني أنه سيتم أخذ الخصائص من application-test.properties. ونتيجة لذلك، سيبدو كما يلي: الآن نطلق قاعدة بيانات الاختبار الخاصة بنا: docker-compose -f docker-compose-test.yml up وبهذه الطريقة بالضبط، بدون البادئة -d، بحيث يمكن رؤية السجلات على الفور المحطة، إذا كانت هناك حاجة إليها. والخطوة الأخيرة هي ببساطة تشغيل الطريقة الرئيسية. إذا فعلت كل شيء بنفس الطريقة التي وصفتها، فسوف ينتهي بك الأمر إلى ما يلي: سيكون السطر الثاني من السجلات عبارة عن وصف لما حصل عليه ملف تعريف الاختبار. نمر عبر MySQLWorkbench ونقوم بتشغيل أمرين للتأكد من أن الترحيل قد بدأ وأن كل شيء يعمل (على الرغم من أن هذا مرئي من سجلات تشغيل التطبيق، إلا أنه بالتأكيد يستحق التحقق):
- استخدم dev_jrtb_db؛
- عرض الجداول؛
GO TO FULL VERSION