Schritt für Schritt kommen wir unserem Ziel näher. Heute müssen wir viele Aufgaben lösen:
Als Erstes aktualisieren wir unseren Hauptzweig im Projekt (git pull) und erstellen einen neuen mit dem Namen unserer Aufgabe – STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Ich möchte Sie daran erinnern: Wir haben die Zweige umbenannt, damit die Reihenfolge der Aufgaben im Projekt nur nach Namen sortiert werden konnte. Dadurch können Sie schnell von einem Schritt zum nächsten wechseln. Jetzt können Sie in Ruhe arbeiten. Wir müssen drei Abhängigkeiten hinzufügen:
Jetzt ist klar, dass die Datenbank mit unseren Einstellungen nie gestartet ist. Der Fehler ist derselbe, also isolieren wir ihn vom Blatt:
Es scheinen keine Fehler mehr vorzuliegen, sodass Sie sehen können, ob ein Zugriff möglich ist. Aber leider gibt es wieder keinen Zugriff... Nichts: Wir werden das noch weiter klären! Um Docker-Compose zu beenden und alle Container zu löschen, müssen Sie Folgendes schreiben: docker-compose -f docker-compose-test.yml down Hier haben wir die zu löschende Datei angegeben. Was zu tun ist? Googeln wir mal: Vielleicht hat es jemand besser gemacht. Die einfachste Abfrage: „Beispiel für MySQL in Docker-Compose“ hilft uns, einen Link zu einer Medium-Ressource zu finden. Sie geben dieses Beispiel:
- Flyway hinzufügen. Hier konfigurieren wir die Bereitstellung der Datenbank für das Projekt.
- Fügen Sie ein Datenbankschema hinzu.
- Fügen Sie eine Repository-Ebene hinzu.
- Fügen Sie einen Befehl für Bot-Statistiken hinzu.
- Schreiben Sie schließlich Tests.
Flyway hinzufügen
Um Flyway hinzuzufügen, benötigen Sie eine Datenbank, die wir als weiteren Dienst in Docker-Compose hinzufügen. Letztes Mal habe ich gesagt, dass Docker-Compose über einen Service-Bereich verfügt, der genau für das Hinzufügen und Verwalten einer bestimmten Infrastruktur verantwortlich ist, also einer Reihe von Anwendungen/Datenbanken/Messengern usw.Ich habe bereits darüber gesprochen, was Flyway ist und wie man es zu einer SpringBoot-Anwendung hinzufügt . Ich rate Ihnen, Ihr Gedächtnis aufzufrischen, bevor Sie diesen Artikel lesen. Sie können auch die Projektdatei README.md mit einer Demonstration eines Artikels über Flyway + SpringBoot lesen. |
<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>
Die erste Abhängigkeit ist für das Hinzufügen von FlyWay zum Projekt verantwortlich, die zweite fügt die Möglichkeit hinzu, eine Verbindung zur MySQL-Datenbank herzustellen. Der dritte ist der SpringBoot-Starter, der die ganze Magie der Verwendung einer Datenbank in Spring auslöst. Und fügen wir auch einen Lombok hinzu, um keine Getter und Setter zu schreiben:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
Jetzt brauchen wir eine Datenbank für die Entwicklung. Wir werden es vorerst ( bis ich eine bessere Idee habe ) als separate Docker-Compose-Datei und eine separate Datei für application.properties erstellen. In der Entwicklung (und insbesondere im Spring-Ökosystem) gibt es so etwas wie Profile. Je nach Profil werden unterschiedliche Einstellungen für den Betrieb gestartet. Ich denke, in Zukunft werden wir Docker-Compose in einer Datei zusammenfassen und sicherstellen, dass nur eine Datenbank für die Entwicklung mit den Einstellungen gestartet wird, die wir benötigen. Im Moment machen wir Folgendes:
- Erstellen wir eine Datei im Stammverzeichnis des Projekts docker-compose-test.yml, in der nur die Datenbank mit ihren eigenen Einstellungen gestartet wird.
- Erstellen wir eine Datei „application-test.properties“ mit Einstellungen, die mit den Einstellungen in der Datei „docker-compose-test.yml“ übereinstimmen.
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
Danach erstelle ich docker-compose-test.yml im Projektstamm:
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
Um diese bestimmte Datei für die Arbeit mit Docker-Compose auszuführen, müssen Sie das Flag -f in der Anfrage verwenden . Dies bedeutet, dass der Name der gestarteten Datei bereitgestellt wird und nicht die standardmäßige docker-compose.yml. Daher sieht die Anfrage so aus: docker-compose -f docker-compose-test.yml up -d Es stellt sich heraus, dass wir zuerst sagen, welche Datei wir nehmen sollen ( -f docker-compose-test.yml ), und dann wir Angenommen, wir müssen Dienste auslösen und dies im Daemon-Modus ( up -d ) tun – das heißt, dass der Prozess außerhalb der Terminalsitzung ausgeführt wird, in der dieser Befehl gestartet wurde. Wir starten die Datenbank und versuchen, eine Verbindung herzustellen, um sicherzustellen, dass sie aktiv ist und verwendet werden kann. Öffnen Sie dazu die bekannte MySQL Workbench ( hier haben wir darüber gesprochen ) und erstellen Sie eine neue Verbindung: Wir müssen die folgenden Felder ausfüllen:
- Verbindungsname – Verbindungsname – optional DEV_JRTB_DB;
- Hostname – hier ist die Adresse, unter der die Datenbank bereitgestellt wird. In unserem Fall bleibt alles so wie es war: 127.0.0.1 oder localhost;
- Benutzername – hier wird root sein, wie wir in Docker-Compose geschrieben haben;
- Passwort - auch root.
Wir bekommen:
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
28.02.2021 11:03:37+00:00 [FEHLER] [Einstiegspunkt]: Datenbank ist nicht initialisiert und Passwortoption ist nicht angegeben dev-jrtb-db | Sie müssen eines von MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD und MYSQL_RANDOM_ROOT_PASSWORD angeben
Das heißt, er muss das Passwort für den Root-Benutzer – den Hauptbenutzer – ermitteln. Okay, jetzt aktualisieren wir unsere Datei:
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
Wir haben diese Variablen für den Benutzer und das Passwort entfernt und nur das Passwort für den Root-Benutzer hinzugefügt. Das bedeutet, dass der Root-Benutzer nun ein Root-Passwort hat. Zumindest gehen wir davon aus. Lassen Sie es uns nun ausführen und sehen, was passiert: docker-compose -f docker-compose-test.yml up -d Und sehen Sie sofort, was uns die Protokolle sagen: docker-compose -f docker-compose-test.yml logs
Lass uns nachsehen:
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:
Wir passen es an unsere Bedürfnisse an und erhalten:
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'
Wir starten diese Option mit dem uns bereits bekannten Befehl: docker-compose -f docker-compose-test.yml up -d Wir versuchen erneut, über MySQLWorkBench auf die Datenbank zuzugreifen: Endlich ist der Zugriff aufgetreten. Aber jetzt frage ich mich, was das beeinflusst hat. Ich sündige in diesem Teil:
expose:
# Opens port 3306 on the container
- '3306'
Man kann es leicht überprüfen: Ohne das sollte nichts funktionieren :D. Überprüfen wir: Löschen Sie diesen Teil, starten Sie Docker-Compose neu: Docker-Compose -f Docker-Compose-Test.yml Down Docker-Compose -f Docker-Compose-Test.yml Up Wir versuchen, uns über Workbench in die Datenbank einzuloggen: Alles ist Bußgeld. Dann ist die einzige Option die Datenbankversion. Es steht eindeutig 5.7, das heißt, wenn Sie es auf die neueste Version ändern, sollte es nicht funktionieren. Ich habe es neu gestartet – und es funktioniert wirklich nicht ... Anscheinend haben sie in der neuesten Version einige Probleme mit dem Docker-Image. Okay, kein Problem. Dies passiert häufig bei kostenloser Software. Wir werden Version 5.7 verwenden. Mal sehen, ob es eine Datenbank gibt, die wir brauchen – dev_jrtb_db. Führen Sie dazu den Query-Befehl in MySQL Workbench aus. SHOW DATABASES : Ja, es ist in der Ausgabe vorhanden. Großartig, wir können weitermachen. Als nächstes fügen wir unsere erste Migration hinzu. Basierend auf den Aufgaben aus dem Artikel „Projektplanung: Zweimal messen, einmal schneiden“ erstellen wir unsere erste Tabelle tg_user. Alle Migrationen befinden sich im Ordner projectDir/src/main/resources/db/migration und der Name lautet: V00001__add_tg_user_table.sql . Warum es in diesem Ordner einen solchen Namen gibt – ich habe es im Artikel über Spring + Flyway beschrieben. So wird unsere erste Migration aussehen: 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
);
Das heißt, wir erstellen hier einfach eine Tabelle eines Benutzers, der nur eine Chat-ID (ein eindeutiges Element, das als ID in der Tabelle verwendet werden kann) und seinen Status – aktiv oder inaktiv – hat. Wenn also der Bot gestoppt wird, bleiben die Abonnementinformationen erhalten und können verwendet werden, wenn sie den Bot erneut verwenden möchten. Weitere Informationen über den Benutzer sind vorerst nicht erforderlich. Nun die Hauptfrage: Wie kann man das überprüfen? Wir müssen unsere Anwendung starten. Bisher hat die Hauptdatei „docker-compose.yml“ keine Verbindung mit der Datenbank und wir müssen auch lernen, wie wir die Anwendung zusammen mit der Datenbank debuggen. Starten wir daher die Anwendung mit Intellij IDEA. Um dies zu testen, müssen wir unsere Hauptmethode in JavarushTelegramBotApplication ausführen. Um die Arbeit der Bereitstellung und des Tests zu trennen, verwenden wir eine andere Datei mit Eigenschaften – application-test.properties . Mit dieser Vorlage teilen wir Spring mit, dass diese Datei für das Testprofil verwendet wird . Wenn wir kein Profil angeben, wird das Standardprofil verwendet (überprüfen Sie dies in Ihren Protokollen, wenn Sie SpringBoot ausführen: darüber wird in den ersten Zeilen geschrieben). So wird es aussehen:
# 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
Und die Hauptanwendungseigenschaften werden etwas anders aussehen:
# 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
Der wesentliche Unterschied liegt im Feld spring.datasource.url: Im Testprofil haben wir eine URL auf localhost . Das heißt, es wird erwartet, dass die Anwendung außerhalb von Docker ausgeführt wird, was wahr ist, denn beim Debuggen führen wir unser Projekt in Intellij IDEA aus und erwarten, dass wir vom lokalen Computer aus Zugriff auf die Datenbank haben. Aber die application.properties-URL enthält bereits eine andere – jrtb-db . Dies wird der Name unserer Datenbank in Docker-Compose sein, und auf diese Weise kann unsere Docker-Anwendung die Datenbank erreichen. Warum? Daher werden sie im selben Docker-Compose gestartet und wissen auf diese Weise voneinander. Dies ist notwendig, damit wir eine geschlossene Infrastruktur für das Projekt haben. Aber wie startet man das Profil beim Start? Dazu können Sie den Start der Hauptmethode in Intellij IDEA konfigurieren. Dafür gibt es Edit Configurations : Gehen Sie zur Hauptklasse von JavarushTelegramBotApplication, klicken Sie auf den grünen Pfeil neben der Deklaration der Hauptmethode und wählen Sie Modify Run Configuration : Geben Sie die notwendigen Variablen ein und konfigurieren Sie das Profil. In Intellij IDEA hat sich die Schnittstelle dieses Konfigurationsfensters leicht geändert, daher rate ich jedem, IDEA auf die neueste Version zu aktualisieren, damit wir das gleiche Bild sehen: Im Feld Umgebungsvariablen müssen wir den Bot-Namen und die Token-Variablen hinzufügen die folgende Vorlage: Variablenname1=Wert1; Variablenname2=Wert2 . Das heißt, Schlüssel=Wert werden durch Semikolons getrennt. In unserem Fall sieht es so aus: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (Sie haben einen anderen Namen und ein anderes Token für den Bot) Wählen Sie als Nächstes das Feld „VM-Optionen hinzufügen“ in der Schaltfläche „Optionen ändern“ aus : Schreiben : -Dspring.profiles.active =test – Dadurch wird SpringBoot angewiesen, das Testprofil zu verwenden, was bedeutet, dass die Eigenschaften aus application-test.properties übernommen werden. Als Ergebnis wird es so aussehen: Jetzt starten wir unsere Testdatenbank: docker-compose -f docker-compose-test.yml up Und genau so, ohne das Präfix -d, damit die Protokolle sofort sichtbar sind das Terminal, falls welche benötigt werden. Und der letzte Schritt besteht darin, einfach die Hauptmethode auszuführen. Wenn Sie alles so machen, wie ich es beschrieben habe, erhalten Sie am Ende: In der zweiten Zeile der Protokolle wird beschrieben, was das Testprofil verdient hat. Wir gehen MySQLWorkbench durch und führen zwei Befehle aus, um zu überprüfen, ob die Migration durchgeführt wurde und alles funktioniert (obwohl dies aus den Startprotokollen der Anwendung ersichtlich ist, lohnt es sich auf jeden Fall, es zu überprüfen):
- benutze dev_jrtb_db;
- Tische anzeigen;
GO TO FULL VERSION