{"id":68423,"date":"2024-07-07T02:35:04","date_gmt":"2024-07-06T23:05:04","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/run-flyway-db-migrations-with-aws-lambda-and-rds-part-1-2a6j\/"},"modified":"2024-07-07T02:35:04","modified_gmt":"2024-07-06T23:05:04","slug":"run-flyway-db-migrations-with-aws-lambda-and-rds-part-1-2a6j","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/run-flyway-db-migrations-with-aws-lambda-and-rds-part-1-2a6j\/","title":{"rendered":"Flyway DB migrations \u0631\u0627 \u0628\u0627 AWS Lambda \u0648 RDS \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f &#8211; \u0642\u0633\u0645\u062a 1"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n            \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u062c\u0631\u0627\u06cc \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc\u200c\u0647\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 SQL \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f: \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0633\u062a\u0648\u0646\u200c\u0647\u0627\u06cc \u062c\u062f\u0648\u0644\u060c \u0627\u0641\u0632\u0648\u062f\u0646 \u0631\u062f\u06cc\u0641\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f\u060c \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0637\u0631\u062d \u062c\u062f\u06cc\u062f \u0648 \u063a\u06cc\u0631\u0647. \u0627\u063a\u0644\u0628 \u062a\u06cc\u0645\u200c\u0647\u0627\u06cc \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u0647 \u0627\u0632 Flyway \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f. \u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 SQL \u0627\u0633\u062a.  \u062f\u0631 Flyway \u0628\u0647 \u062a\u0645\u0627\u0645 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a DDL \u0648 DML \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0647\u0627\u062c\u0631\u062a \u06af\u0641\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f.  \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0646\u0633\u062e\u0647 \u06cc\u0627 \u062a\u06a9\u0631\u0627\u0631 \u06a9\u0631\u062f. <\/p>\n<p>\u0627\u06af\u0631 \u062e\u0648\u0634\u0647 RDS \u062f\u0631 \u0632\u06cc\u0631\u0634\u0628\u06a9\u0647 \u062e\u0635\u0648\u0635\u06cc \u0627\u0633\u062a\u060c \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u06cc\u0646 \u0645\u0647\u0627\u062c\u0631\u062a\u200c\u0647\u0627\u06cc DB \u0631\u0627 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f\u061f\u06cc\u06a9\u06cc \u0627\u0632 \u0631\u0627\u0647 \u062d\u0644 \u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 AWS Lambda \u062f\u0631 \u0647\u0645\u0627\u0646 VPC \u0627\u0633\u062a \u06a9\u0647 flyway \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 DB \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f. <\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06a9\u0627\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645:<\/p>\n<p>\u0642\u0633\u0645\u062a 1 &#8211; \u0627\u06cc\u062c\u0627\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0645\u062d\u0644\u06cc<\/p>\n<p>\u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<br \/>\n\u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0628\u0631\u0627\u06cc PostgreSQL \u0648 Flyway \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u06cc\u0645 \u06a9\u062f \u062e\u0648\u062f \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u0645<br \/>\n\u06a9\u0644\u0627\u0633 \u062c\u0627\u0648\u0627 \u0631\u0627 \u0628\u0646\u0648\u06cc\u0633\u06cc\u062f \u06a9\u0647 Flyway Migrations \u0631\u0627 \u062f\u0631 \u0638\u0631\u0641 \u062f\u0627\u06a9\u0631 \u0645\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u062f<\/p>\n<p>\u0642\u0633\u0645\u062a 2 &#8211; \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062f\u0631 AWS<\/p>\n<p>AWS Lambda \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Terraform \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n\u06a9\u0644\u0627\u0633 \u062c\u0627\u0648\u0627 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f \u0648 \u06a9\u062f \u0631\u0627 \u062f\u0631 \u0644\u0627\u0645\u0628\u062f\u0627 \u0645\u0633\u062a\u0642\u0631 \u06a9\u0646\u06cc\u062f<br \/>\n\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0632 Lambda \u0628\u0647 RDS (\u0628\u062f\u0648\u0646 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 DB \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0627\u0633\u062a)<br \/>\n\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u2514\u2500\u2500 src<br \/>\n    \u251c\u2500\u2500 main<br \/>\n        \u251c\u2500\u2500 java<br \/>\n        \u2502   \u2514\u2500\u2500 com<br \/>\n        \u2502       \u2514\u2500\u2500 example<br \/>\n        \u2502           \u2514\u2500\u2500 DatabaseMigrationHandler.java<br \/>\n        \u2514\u2500\u2500 resources<br \/>\n            \u2514\u2500\u2500 db<br \/>\n                \u2514\u2500\u2500 migration<br \/>\n                    \u2514\u2500\u2500 V1__Create_table.sql<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0645\u0647\u0627\u062c\u0631\u062a SQL \u0645\u0627 \u062f\u0631 \u067e\u0648\u0634\u0647 src\/resources\/db\/migration \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u062f<br \/>\n\u06a9\u0644\u0627\u0633 \u0627\u0635\u0644\u06cc \u062c\u0627\u0648\u0627 \u0645\u0627 \u062f\u0631 DatabaseMigrationHandler.java \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f (\u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0633\u062a\u0647 \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0631\u0648\u0634\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0646\u0627\u0645 \u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f &#8211; \u0645\u0646 \u0622\u0646 \u0631\u0627 com.example \u0646\u0627\u0645 \u06af\u0630\u0627\u0631\u06cc \u06a9\u0631\u062f\u0645)<\/p>\n<p>\u062a\u0646\u0638\u06cc\u0645 Docker Compose \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u0645\u062d\u0644\u06cc<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a\u060c \u0645\u0627 \u0627\u0632 Docker Compose \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0645\u062d\u0644\u06cc \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Flyway \u0648 PostgreSQL \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u0635\u0631\u0641 \u0646\u0638\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0627 \u06a9\u062f \u0628\u0647 git repo \u0628\u0631\u0633\u06cc\u062f<\/p>\n<p>\/docker<br \/>\n\u251c\u2500\u2500 .env.pg_admin<br \/>\n\u251c\u2500\u2500 README.md<br \/>\n\u251c\u2500\u2500 docker-compose.yml<br \/>\n\u2514\u2500\u2500 init<br \/>\n    \u2514\u2500\u2500 create_schemas.sql<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>CREATE SCHEMA IF NOT EXISTS myschema;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u0641\u0627\u06cc\u0644 \u062c\u062f\u06cc\u062f .env.pg_admin \u062f\u0631 \u062f\u0627\u062e\u0644 \u067e\u0648\u0634\u0647 docker &#8211; \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u062d\u0627\u0648\u06cc \u0645\u0642\u0627\u062f\u06cc\u0631\u06cc \u0628\u0631\u0627\u06cc \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc env \u0628\u0631\u0627\u06cc \u06cc\u06a9\u06cc \u0627\u0632 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631\u0647\u0627\u06cc docker \u0627\u0633\u062a.<\/p>\n<p>PGADMIN_DEFAULT_EMAIL=user@domain.com<br \/>\nPGADMIN_DEFAULT_PASSWORD=mysecretpassword<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a docker-compose.yml \u0631\u0627 \u062f\u0631 \u062f\u0627\u062e\u0644 \u067e\u0648\u0634\u0647 docker \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>version: &#8216;3.1&#8217;<\/p>\n<p>services:<br \/>\n  db:<br \/>\n    image: postgres<br \/>\n    restart: always<br \/>\n    environment:<br \/>\n      POSTGRES_USER: postgres<br \/>\n      POSTGRES_PASSWORD: mysecretpassword<br \/>\n    volumes:<br \/>\n      &#8211; .\/local-data:\/var\/lib\/postgresql\/data<br \/>\n      &#8211; .\/init:\/docker-entrypoint-initdb.d # init scripts are executed upon DB container startup<br \/>\n    ports:<br \/>\n      &#8211; 5432:5432<\/p>\n<p>  flyway:<br \/>\n    image: flyway\/flyway<br \/>\n    depends_on:<br \/>\n      &#8211; db<br \/>\n    volumes:<br \/>\n      &#8211; ..\/src\/main\/resources\/db\/migration:\/flyway\/sql<br \/>\n    command: -url=jdbc:postgresql:\/\/db:5432\/postgres -schemas=myschema -user=postgres -password=mysecretpassword -connectRetries=60 migrate<\/p>\n<p>  pg_admin:<br \/>\n    image: dpage\/pgadmin4<br \/>\n    depends_on:<br \/>\n      &#8211; db<br \/>\n    env_file:<br \/>\n      &#8211; .env.pg_admin<br \/>\n    ports:<br \/>\n      &#8211; 80:80<\/p>\n<p>volumes:<br \/>\n  local-data:<br \/>\n    external: false<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u0627 \u0633\u0647 \u0633\u0631\u0648\u06cc\u0633 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645: db\u060c flyway \u0648 pg_admin.<\/p>\n<p>\u0633\u0631\u0648\u06cc\u0633 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 (db)<\/p>\n<p>\u062e\u062f\u0645\u0627\u062a \u067e\u0631\u0648\u0627\u0632 (flyway)<\/p>\n<p>Depends_on: \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0633\u0631\u0648\u06cc\u0633 db \u0642\u0628\u0644 \u0627\u0632 \u0633\u0631\u0648\u06cc\u0633 Flyway \u0634\u0631\u0648\u0639 \u0645\u06cc \u0634\u0648\u062f.<br \/>\n\u062d\u062c\u0645 \u0647\u0627: \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0645\u062d\u0644\u06cc \u062d\u0627\u0648\u06cc \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0627\u0646\u062a\u0642\u0627\u0644 SQL \u0631\u0627 \u0628\u0647 \u0645\u06a9\u0627\u0646 \u0645\u0648\u0631\u062f \u0627\u0646\u062a\u0638\u0627\u0631 Flyway \u0646\u06af\u0627\u0634\u062a \u0645\u06cc \u06a9\u0646\u062f.<br \/>\n\u0641\u0631\u0645\u0627\u0646: \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627 \u0631\u0627 \u0628\u0647 Flyway \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f:<\/p>\n<p>   -url=jdbc:postgresql:\/\/db:5432\/postgres: JDBC URL to connect to the PostgreSQL database.<br \/>\n   -schemas=myschema: Specifies the schema to migrate.<br \/>\n   -user=postgres and -password=mysecretpassword: Database credentials.<br \/>\n   -connectRetries=60: Retries the connection for up to 60 seconds if the database is not immediately available.<br \/>\n   migrate: Command to run the migrations.<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0633\u0631\u0648\u06cc\u0633 pgAdmin (pg_admin)<\/p>\n<p>Depends_on: \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0633\u0631\u0648\u06cc\u0633 db \u0642\u0628\u0644 \u0627\u0632 pgAdmin \u0634\u0631\u0648\u0639 \u0645\u06cc \u0634\u0648\u062f.<br \/>\nEnv_file: \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637 \u0631\u0627 \u0627\u0632 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 .env.pg_admin \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u062f \u062a\u0627 pgAdmin \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u062f.<br \/>\n\u067e\u0648\u0631\u062a \u0647\u0627: \u067e\u0648\u0631\u062a 80 \u0631\u0648\u06cc \u0647\u0627\u0633\u062a \u0631\u0627 \u0628\u0647 \u067e\u0648\u0631\u062a 80 \u062f\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 pgAdmin \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0645\u0631\u0648\u0631\u06af\u0631 \u0648\u0628 \u0645\u06cc\u200c\u0631\u0633\u0627\u0646\u062f.<\/p>\n<p>\u0638\u0631\u0648\u0641 \u0631\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f<\/p>\n<p>cd docker<br \/>\ndocker-compose up -d<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u062c\u0631\u0627\u06cc Flyway \u0631\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>docker ps -a<br \/>\ndocker logs  &#8211;tail 20<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u06a9\u0644\u0627\u0633 \u062c\u0627\u0648\u0627 \u0628\u0646\u0648\u06cc\u0633\u06cc\u062f<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0628\u062e\u0634\u060c \u0645\u0627 \u0628\u0647 \u06a9\u0644\u0627\u0633 Java DatabaseMigrationHandler \u0645\u06cc \u067e\u0631\u062f\u0627\u0632\u06cc\u0645 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc Flyway \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062d\u0644\u06cc PostgreSQL \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u062f\u0631 \u06cc\u06a9 \u0638\u0631\u0641 Docker \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a.  \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u062a\u0645\u0627\u0645 \u0645\u0646\u0637\u0642 \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u0627\u062a\u0635\u0627\u0644 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627 \u0631\u0627 \u062f\u0631 \u0628\u0631 \u0645\u06cc \u06af\u06cc\u0631\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u0635\u0631\u0641 \u0646\u0638\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0627 \u06a9\u062f \u0628\u0647 git repo \u0628\u0631\u0633\u06cc\u062f<\/p>\n<p>package com.example;<\/p>\n<p>import org.flywaydb.core.Flyway;<\/p>\n<p>import java.sql.Connection;<br \/>\nimport java.sql.SQLException;<br \/>\nimport java.util.Properties;<br \/>\nimport java.util.Objects;<br \/>\nimport software.amazon.jdbc.PropertyDefinition;<br \/>\nimport software.amazon.jdbc.ds.AwsWrapperDataSource;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>Package Declaration: \u06a9\u0644\u0627\u0633 \u0628\u062e\u0634\u06cc \u0627\u0632 \u0628\u0633\u062a\u0647 com.example \u0627\u0633\u062a.\u0648\u0627\u0631\u062f\u0627\u062a: \u06a9\u0644\u0627\u0633\u200c\u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Flyway\u060c \u0628\u0633\u062a\u0647 \u062c\u0627\u0648\u0627 SQL \u0648 \u0628\u0633\u062a\u0647\u200c\u0628\u0646\u062f\u06cc AWS JDBC \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u062a\u0635\u0627\u0644\u0627\u062a \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648\u0627\u0631\u062f \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.<\/p>\n<p>\u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u06a9\u0644\u0627\u0633 \u0648 \u0646\u0645\u0648\u0646\u0647<\/p>\n<p>public class DatabaseMigrationHandler {<br \/>\n    \/\/ instance vars<br \/>\n    private final String dbHost;<br \/>\n    private final String dbPort;<br \/>\n    private final String dbName;<br \/>\n    private final String dbSchema;<br \/>\n    private final String dbUser;<br \/>\n    private final String dbPassword;<\/p>\n<p>    private static final String DB_HOST = &#8220;localhost&#8221;;<br \/>\n    private static final String DB_PORT = &#8220;5432&#8221;;<br \/>\n    private static final String DB_NAME = &#8220;postgres&#8221;;<br \/>\n    private static final String DB_SCHEMA = &#8220;myschema&#8221;;<br \/>\n    private static final String DB_USER = &#8220;postgres&#8221;;<br \/>\n    private static final String DB_PASSWORD = &#8220;mysecretpassword&#8221;;<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0646\u0645\u0648\u0646\u0647: \u0627\u06cc\u0646\u0647\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0627\u0646\u0646\u062f \u0645\u06cc\u0632\u0628\u0627\u0646\u060c \u067e\u0648\u0631\u062a\u060c \u0646\u0627\u0645\u060c \u0637\u0631\u062d\u0648\u0627\u0631\u0647\u060c \u06a9\u0627\u0631\u0628\u0631 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u0646\u062f.\u062b\u0627\u0628\u062a \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9: \u0645\u0642\u0627\u062f\u06cc\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u0628\u0631\u0627\u06cc \u062c\u0632\u0626\u06cc\u0627\u062a \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u062b\u0627\u0628\u062a \u0647\u0627\u06cc \u062b\u0627\u0628\u062a \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u0634\u0648\u0646\u062f.<\/p>\n<p>    public DatabaseMigrationHandler() {<br \/>\n        this.dbHost = DB_HOST;<br \/>\n        this.dbPort = DB_PORT;<br \/>\n        this.dbName = DB_NAME;<br \/>\n        this.dbSchema = DB_SCHEMA;<br \/>\n        this.dbUser = DB_USER;<br \/>\n        this.dbPassword = DB_PASSWORD;<br \/>\n    }<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0633\u0627\u0632\u0646\u062f\u0647: \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0646\u0645\u0648\u0646\u0647 \u0631\u0627 \u0628\u0627 \u0645\u0642\u0627\u062f\u06cc\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062f\u0631 \u0628\u0627\u0644\u0627 \u0645\u0642\u062f\u0627\u0631\u062f\u0647\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>    private boolean testConnection() {<br \/>\n        try (Connection connection = getDataSource().getConnection()) {<br \/>\n            return connection != null;<br \/>\n        } catch (SQLException e) {<br \/>\n            e.printStackTrace();<br \/>\n            return false;<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0631\u0648\u0634 testConnection: \u062a\u0644\u0627\u0634 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647.  \u062f\u0631 \u0635\u0648\u0631\u062a \u0645\u0648\u0641\u0642\u06cc\u062a\u060c true \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f\u060c \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0627\u0633\u062a\u062b\u0646\u0627 \u0631\u0627 \u062b\u0628\u062a \u0645\u06cc \u06a9\u0646\u062f \u0648 false \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<p>    private void runMigrations() {<br \/>\n        try{<br \/>\n            Flyway flyway = Flyway.configure()<br \/>\n                    .dataSource(getDataSource())<br \/>\n                    .schemas(this.dbSchema.  )<br \/>\n                    .load();<br \/>\n            flyway.migrate();<br \/>\n            System.out.println(&#8220;Completed Database migration!&#8221;);<br \/>\n        } catch (Exception e) {<br \/>\n            System.out.println(&#8220;Database migration failed!&#8221;);<br \/>\n            e.printStackTrace();<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0631\u0648\u0634 runMigrations: \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc Flyway \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0648 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u0632 \u06a9\u0644\u0627\u0633 Flyway \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0645\u0646\u0628\u0639 \u062f\u0627\u062f\u0647 \u0648 \u0637\u0631\u062d\u0648\u0627\u0631\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0633\u067e\u0633 \u0641\u0631\u0622\u06cc\u0646\u062f \u0645\u0647\u0627\u062c\u0631\u062a \u0631\u0627 \u0622\u063a\u0627\u0632 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u0646\u0628\u0639 \u062f\u0627\u062f\u0647<\/p>\n<p>    private AwsWrapperDataSource getDataSource() {<br \/>\n        Properties targetDataSourceProps = new Properties();<br \/>\n        targetDataSourceProps.setProperty(&#8220;ssl&#8221;, &#8220;false&#8221;);<br \/>\n        targetDataSourceProps.setProperty(&#8220;password&#8221;, this.dbPassword);<\/p>\n<p>        AwsWrapperDataSource ds = new AwsWrapperDataSource();<br \/>\n        ds.setJdbcProtocol(&#8220;jdbc:postgresql:&#8221;);<br \/>\n        ds.setTargetDataSourceClassName(&#8220;org.postgresql.ds.PGSimpleDataSource&#8221;);<br \/>\n        ds.setServerName(this.dbHost);<br \/>\n        ds.setDatabase(this.dbName);<br \/>\n        ds.setServerPort(this.dbPort);<br \/>\n        ds.setUser(this.dbUser);<br \/>\n        ds.setTargetDataSourceProperties(targetDataSourceProps);<\/p>\n<p>        return ds;<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0631\u0648\u0634 getDataSource: \u0645\u0646\u0628\u0639 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 AwsWrapperDataSource \u0628\u0631\u0627\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 PostgreSQL \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0645\u0627\u0646\u0646\u062f \u0646\u0627\u0645 \u0633\u0631\u0648\u0631\u060c \u0646\u0627\u0645 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u060c \u067e\u0648\u0631\u062a\u060c \u06a9\u0627\u0631\u0628\u0631 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>    public static void main(String[] args) {<br \/>\n        DatabaseMigrationHandler handler = new DatabaseMigrationHandler();<br \/>\n        if (handler.testConnection()) {<br \/>\n            System.out.println(&#8220;Database connection successful!&#8221;);<br \/>\n            handler.runMigrations();<br \/>\n        } else {<br \/>\n            System.out.println(&#8220;Failed to connect to the database.&#8221;);<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0631\u0648\u0634 \u0627\u0635\u0644\u06cc: \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0628\u0631\u0646\u0627\u0645\u0647.  \u0627\u06cc\u0646 \u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 \u0627\u0632 DatabaseMigrationHandler \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f\u060c \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u062f\u0631 \u0635\u0648\u0631\u062a \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0628\u0648\u062f\u0646 \u0627\u062a\u0635\u0627\u0644\u060c \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u062a\u0648\u0636\u06cc\u062d build.gradle<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0628\u062e\u0634\u060c \u0641\u0627\u06cc\u0644 build.gradle \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0641\u0631\u0622\u06cc\u0646\u062f \u0633\u0627\u062e\u062a \u067e\u0631\u0648\u0698\u0647 \u062c\u0627\u0648\u0627 \u0634\u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.  \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0631\u062e\u06cc \u0627\u0632 \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0645\u0641\u06cc\u062f Gradle \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0648 \u0627\u062c\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647 \u0634\u0645\u0627 \u067e\u0648\u0634\u0634 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f.<\/p>\n<p>plugins {<br \/>\n    id &#8216;java&#8217;<br \/>\n    id &#8216;groovy&#8217;<br \/>\n    id &#8216;application&#8217;<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u0641\u0632\u0648\u0646\u0647 application: \u0627\u06cc\u062c\u0627\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062c\u0627\u0648\u0627 \u0631\u0627 \u062a\u0633\u0647\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0648\u0638\u0627\u06cc\u0641\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f<\/p>\n<p>dependencies {<br \/>\n    implementation &#8216;org.flywaydb:flyway-core:9.22.3&#8217;<br \/>\n    implementation &#8216;org.postgresql:postgresql:42.7.2&#8217;<br \/>\n    implementation &#8216;software.amazon.jdbc:aws-advanced-jdbc-wrapper:2.3.0&#8217;<\/p>\n<p>    testImplementation platform(&#8216;org.junit:junit-bom:5.10.0&#8217;)<br \/>\n    testImplementation &#8216;org.junit.jupiter:junit-jupiter&#8217;<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc: \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0627\u0639\u0644\u0627\u0645 \u0645\u06cc \u06a9\u0646\u062f.  \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c flyway-core\u060c postgresql\u060c \u0648 aws-advanced-jdbc-wrapper \u06af\u0646\u062c\u0627\u0646\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>application {<br \/>\n    mainClass=&#8221;com.example.DatabaseMigrationHandler&#8221;<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>mainClass: \u06a9\u0644\u0627\u0633 \u0627\u0635\u0644\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 com.example.DatabaseMigrationHandler \u0627\u0633\u062a.  \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a.<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u0641\u0627\u06cc\u0644 build.gradle \u062e\u0648\u062f \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0631\u062f\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0686\u0646\u062f\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 Gradle \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.  \u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0627\u0632 \u062e\u0637 \u0641\u0631\u0645\u0627\u0646 \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u0646\u062f.<\/p>\n<p>.\/gradlew clean<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>clean: \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0633\u0627\u062e\u062a \u0631\u0627 \u062d\u0630\u0641 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0648\u062b\u0631 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062a\u0645\u06cc\u0632 \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0633\u0627\u062e\u062a \u062a\u0627\u0632\u0647 \u0645\u0641\u06cc\u062f \u0627\u0633\u062a.<\/p>\n<p>.\/gradlew build<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>build: \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u0647\u0627 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 JAR \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u062a\u0645\u0627\u0645 \u0645\u0631\u0627\u062d\u0644 \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0622\u0631\u062a\u06cc\u0641\u06a9\u062a \u0633\u0627\u062e\u062a \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>.\/gradlew run<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>run: \u06a9\u0644\u0627\u0633 \u0627\u0635\u0644\u06cc \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u062f\u0631 \u0642\u0633\u0645\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f.  \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f\u060c com.example.DatabaseMigrationHandler \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc Flyway \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0644\u0627\u06af \u0647\u0627 \u0628\u0627\u06cc\u062f \u0628\u0628\u06cc\u0646\u06cc\u062f \u06a9\u0647 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 DB \u0628\u0631\u0642\u0631\u0627\u0631 \u0634\u062f \u0648 \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc DB \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u0627\u062c\u0631\u0627 \u0634\u062f.<\/p>\n<div data-article-id=\"1867061\" id=\"article-body\">\n<p>\u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u062c\u0631\u0627\u06cc \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc\u200c\u0647\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 SQL \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f: \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0633\u062a\u0648\u0646\u200c\u0647\u0627\u06cc \u062c\u062f\u0648\u0644\u060c \u0627\u0641\u0632\u0648\u062f\u0646 \u0631\u062f\u06cc\u0641\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f\u060c \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0637\u0631\u062d \u062c\u062f\u06cc\u062f \u0648 \u063a\u06cc\u0631\u0647. \u0627\u063a\u0644\u0628 \u062a\u06cc\u0645\u200c\u0647\u0627\u06cc \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u0647 \u0627\u0632 Flyway \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f. \u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 SQL \u0627\u0633\u062a.  \u062f\u0631 Flyway \u0628\u0647 \u062a\u0645\u0627\u0645 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a DDL \u0648 DML \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0647\u0627\u062c\u0631\u062a \u06af\u0641\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f.  \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0646\u0633\u062e\u0647 \u06cc\u0627 \u062a\u06a9\u0631\u0627\u0631 \u06a9\u0631\u062f. <\/p>\n<p>\u0627\u06af\u0631 \u062e\u0648\u0634\u0647 RDS \u062f\u0631 \u0632\u06cc\u0631\u0634\u0628\u06a9\u0647 \u062e\u0635\u0648\u0635\u06cc \u0627\u0633\u062a\u060c \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u06cc\u0646 \u0645\u0647\u0627\u062c\u0631\u062a\u200c\u0647\u0627\u06cc DB \u0631\u0627 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0646\u06cc\u062f\u061f<br \/>\u06cc\u06a9\u06cc \u0627\u0632 \u0631\u0627\u0647 \u062d\u0644 \u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 AWS Lambda \u062f\u0631 \u0647\u0645\u0627\u0646 VPC \u0627\u0633\u062a \u06a9\u0647 flyway \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 DB \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f. <\/p>\n<p><\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u06a9\u0627\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0627 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u0645:<\/p>\n<p>\u0642\u0633\u0645\u062a 1 &#8211; \u0627\u06cc\u062c\u0627\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0645\u062d\u0644\u06cc<\/p>\n<ol>\n<li>\u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u062a\u0635\u0648\u06cc\u0631 \u062f\u0627\u06a9\u0631 \u0628\u0631\u0627\u06cc PostgreSQL \u0648 Flyway \u062a\u0627 \u0628\u062a\u0648\u0627\u0646\u06cc\u0645 \u06a9\u062f \u062e\u0648\u062f \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u0645<\/li>\n<li>\u06a9\u0644\u0627\u0633 \u062c\u0627\u0648\u0627 \u0631\u0627 \u0628\u0646\u0648\u06cc\u0633\u06cc\u062f \u06a9\u0647 Flyway Migrations \u0631\u0627 \u062f\u0631 \u0638\u0631\u0641 \u062f\u0627\u06a9\u0631 \u0645\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u062f<\/li>\n<\/ol>\n<p>\u0642\u0633\u0645\u062a 2 &#8211; \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062f\u0631 AWS<\/p>\n<ol>\n<li>AWS Lambda \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Terraform \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u06a9\u0644\u0627\u0633 \u062c\u0627\u0648\u0627 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f \u0648 \u06a9\u062f \u0631\u0627 \u062f\u0631 \u0644\u0627\u0645\u0628\u062f\u0627 \u0645\u0633\u062a\u0642\u0631 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u0632 Lambda \u0628\u0647 RDS (\u0628\u062f\u0648\u0646 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 DB \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0627\u0633\u062a)<\/li>\n<li>\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc \u06a9\u0646\u06cc\u062f<\/li>\n<\/ol>\n<hr\/>\n<p><strong>\u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\u2514\u2500\u2500 src\n    \u251c\u2500\u2500 main\n        \u251c\u2500\u2500 java\n        \u2502   \u2514\u2500\u2500 com\n        \u2502       \u2514\u2500\u2500 example\n        \u2502           \u2514\u2500\u2500 DatabaseMigrationHandler.java\n        \u2514\u2500\u2500 resources\n            \u2514\u2500\u2500 db\n                \u2514\u2500\u2500 migration\n                    \u2514\u2500\u2500 V1__Create_table.sql\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0645\u0647\u0627\u062c\u0631\u062a SQL \u0645\u0627 \u062f\u0631 \u067e\u0648\u0634\u0647 src\/resources\/db\/migration \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u062f<\/li>\n<li>\u06a9\u0644\u0627\u0633 \u0627\u0635\u0644\u06cc \u062c\u0627\u0648\u0627 \u0645\u0627 \u062f\u0631 DatabaseMigrationHandler.java \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f (\u0634\u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0633\u062a\u0647 \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0631\u0648\u0634\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0646\u0627\u0645 \u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f &#8211; \u0645\u0646 \u0622\u0646 \u0631\u0627 com.example \u0646\u0627\u0645 \u06af\u0630\u0627\u0631\u06cc \u06a9\u0631\u062f\u0645)<\/li>\n<\/ul>\n<hr\/>\n<p><strong>\u062a\u0646\u0638\u06cc\u0645 Docker Compose \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u0645\u062d\u0644\u06cc<\/strong><\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a\u060c \u0645\u0627 \u0627\u0632 Docker Compose \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0645\u062d\u0644\u06cc \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Flyway \u0648 PostgreSQL \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u0635\u0631\u0641 \u0646\u0638\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0627 \u06a9\u062f \u0628\u0647 git repo \u0628\u0631\u0633\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>\/docker\n\u251c\u2500\u2500 .env.pg_admin\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 docker-compose.yml\n\u2514\u2500\u2500 init\n    \u2514\u2500\u2500 create_schemas.sql\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>CREATE SCHEMA IF NOT EXISTS myschema;\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u0627\u06cc\u062c\u0627\u062f \u0641\u0627\u06cc\u0644 \u062c\u062f\u06cc\u062f .env.pg_admin \u062f\u0631 \u062f\u0627\u062e\u0644 \u067e\u0648\u0634\u0647 docker &#8211; \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u062d\u0627\u0648\u06cc \u0645\u0642\u0627\u062f\u06cc\u0631\u06cc \u0628\u0631\u0627\u06cc \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc env \u0628\u0631\u0627\u06cc \u06cc\u06a9\u06cc \u0627\u0632 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631\u0647\u0627\u06cc docker \u0627\u0633\u062a.\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>PGADMIN_DEFAULT_EMAIL=user@domain.com\nPGADMIN_DEFAULT_PASSWORD=mysecretpassword\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a docker-compose.yml \u0631\u0627 \u062f\u0631 \u062f\u0627\u062e\u0644 \u067e\u0648\u0634\u0647 docker \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>version: '3.1'\n\nservices:\n  db:\n    image: postgres\n    restart: always\n    environment:\n      POSTGRES_USER: postgres\n      POSTGRES_PASSWORD: mysecretpassword\n    volumes:\n      - .\/local-data:\/var\/lib\/postgresql\/data\n      - .\/init:\/docker-entrypoint-initdb.d # init scripts are executed upon DB container startup\n    ports:\n      - 5432:5432\n\n  flyway:\n    image: flyway\/flyway\n    depends_on:\n      - db \n    volumes:\n      - ..\/src\/main\/resources\/db\/migration:\/flyway\/sql\n    command: -url=jdbc:postgresql:\/\/db:5432\/postgres -schemas=myschema -user=postgres -password=mysecretpassword -connectRetries=60 migrate\n\n  pg_admin:\n    image: dpage\/pgadmin4\n    depends_on:\n      - db \n    env_file:\n      - .env.pg_admin\n    ports:\n      - 80:80\n\nvolumes:\n  local-data:\n    external: false\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627 \u0633\u0647 \u0633\u0631\u0648\u06cc\u0633 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645: db\u060c flyway \u0648 pg_admin.<\/p>\n<p><em>\u0633\u0631\u0648\u06cc\u0633 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 (db)<\/em><\/p>\n<p><em>\u062e\u062f\u0645\u0627\u062a \u067e\u0631\u0648\u0627\u0632 (flyway)<\/em><\/p>\n<ul>\n<li>Depends_on: \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0633\u0631\u0648\u06cc\u0633 db \u0642\u0628\u0644 \u0627\u0632 \u0633\u0631\u0648\u06cc\u0633 Flyway \u0634\u0631\u0648\u0639 \u0645\u06cc \u0634\u0648\u062f.<\/li>\n<li>\u062d\u062c\u0645 \u0647\u0627: \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0645\u062d\u0644\u06cc \u062d\u0627\u0648\u06cc \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0627\u0646\u062a\u0642\u0627\u0644 SQL \u0631\u0627 \u0628\u0647 \u0645\u06a9\u0627\u0646 \u0645\u0648\u0631\u062f \u0627\u0646\u062a\u0638\u0627\u0631 Flyway \u0646\u06af\u0627\u0634\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\u0641\u0631\u0645\u0627\u0646: \u067e\u0627\u0631\u0627\u0645\u062a\u0631\u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627 \u0631\u0627 \u0628\u0647 Flyway \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u062f:\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>   -url=jdbc:postgresql:\/\/db:5432\/postgres: JDBC URL to connect to the PostgreSQL database.\n   -schemas=myschema: Specifies the schema to migrate.\n   -user=postgres and -password=mysecretpassword: Database credentials.\n   -connectRetries=60: Retries the connection for up to 60 seconds if the database is not immediately available.\n   migrate: Command to run the migrations.\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><em>\u0633\u0631\u0648\u06cc\u0633 pgAdmin (pg_admin)<\/em><\/p>\n<ul>\n<li>Depends_on: \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0633\u0631\u0648\u06cc\u0633 db \u0642\u0628\u0644 \u0627\u0632 pgAdmin \u0634\u0631\u0648\u0639 \u0645\u06cc \u0634\u0648\u062f.<\/li>\n<li>Env_file: \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0645\u062d\u06cc\u0637 \u0631\u0627 \u0627\u0632 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 .env.pg_admin \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u062f \u062a\u0627 pgAdmin \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u062f.<\/li>\n<li>\u067e\u0648\u0631\u062a \u0647\u0627: \u067e\u0648\u0631\u062a 80 \u0631\u0648\u06cc \u0647\u0627\u0633\u062a \u0631\u0627 \u0628\u0647 \u067e\u0648\u0631\u062a 80 \u062f\u0631 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 pgAdmin \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0645\u0631\u0648\u0631\u06af\u0631 \u0648\u0628 \u0645\u06cc\u200c\u0631\u0633\u0627\u0646\u062f.<\/li>\n<\/ul>\n<p>\u0638\u0631\u0648\u0641 \u0631\u0627 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>cd docker\ndocker-compose up -d\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u062c\u0631\u0627\u06cc Flyway \u0631\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>docker ps -a\ndocker logs <container-id-or-name> --tail 20\n<\/container-id-or-name><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzthp2pk2xcwgahfca4ad.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"800\" height=\"424\" title=\"\"><\/p>\n<hr\/>\n<p><strong>\u06a9\u0644\u0627\u0633 \u062c\u0627\u0648\u0627 \u0628\u0646\u0648\u06cc\u0633\u06cc\u062f<\/strong><\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0628\u062e\u0634\u060c \u0645\u0627 \u0628\u0647 \u06a9\u0644\u0627\u0633 Java DatabaseMigrationHandler \u0645\u06cc \u067e\u0631\u062f\u0627\u0632\u06cc\u0645 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc Flyway \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062d\u0644\u06cc PostgreSQL \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u062f\u0631 \u06cc\u06a9 \u0638\u0631\u0641 Docker \u0637\u0631\u0627\u062d\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a.  \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u062a\u0645\u0627\u0645 \u0645\u0646\u0637\u0642 \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u0627\u062a\u0635\u0627\u0644 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627 \u0631\u0627 \u062f\u0631 \u0628\u0631 \u0645\u06cc \u06af\u06cc\u0631\u062f.<\/p>\n<p>\u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u0635\u0631\u0641 \u0646\u0638\u0631 \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0627 \u06a9\u062f \u0628\u0647 git repo \u0628\u0631\u0633\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>package com.example;\n\nimport org.flywaydb.core.Flyway;\n\nimport java.sql.Connection;\nimport java.sql.SQLException;\nimport java.util.Properties;\nimport java.util.Objects;\nimport software.amazon.jdbc.PropertyDefinition;\nimport software.amazon.jdbc.ds.AwsWrapperDataSource;\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>Package Declaration: \u06a9\u0644\u0627\u0633 \u0628\u062e\u0634\u06cc \u0627\u0632 \u0628\u0633\u062a\u0647 com.example \u0627\u0633\u062a.<br \/>\u0648\u0627\u0631\u062f\u0627\u062a: \u06a9\u0644\u0627\u0633\u200c\u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 Flyway\u060c \u0628\u0633\u062a\u0647 \u062c\u0627\u0648\u0627 SQL \u0648 \u0628\u0633\u062a\u0647\u200c\u0628\u0646\u062f\u06cc AWS JDBC \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u062a\u0635\u0627\u0644\u0627\u062a \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648\u0627\u0631\u062f \u0645\u06cc\u200c\u0634\u0648\u0646\u062f.<\/p>\n<ul>\n<li>\u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u06a9\u0644\u0627\u0633 \u0648 \u0646\u0645\u0648\u0646\u0647\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>public class DatabaseMigrationHandler {\n    \/\/ instance vars\n    private final String dbHost;\n    private final String dbPort;\n    private final String dbName;\n    private final String dbSchema;\n    private final String dbUser;\n    private final String dbPassword;\n\n    private static final String DB_HOST = \"localhost\";\n    private static final String DB_PORT = \"5432\";\n    private static final String DB_NAME = \"postgres\";\n    private static final String DB_SCHEMA = \"myschema\";\n    private static final String DB_USER = \"postgres\";\n    private static final String DB_PASSWORD = \"mysecretpassword\";\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0646\u0645\u0648\u0646\u0647: \u0627\u06cc\u0646\u0647\u0627 \u062c\u0632\u0626\u06cc\u0627\u062a \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0627\u0646\u0646\u062f \u0645\u06cc\u0632\u0628\u0627\u0646\u060c \u067e\u0648\u0631\u062a\u060c \u0646\u0627\u0645\u060c \u0637\u0631\u062d\u0648\u0627\u0631\u0647\u060c \u06a9\u0627\u0631\u0628\u0631 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u0646\u062f.<br \/>\u062b\u0627\u0628\u062a \u0627\u0633\u062a\u0627\u062a\u06cc\u06a9: \u0645\u0642\u0627\u062f\u06cc\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u0628\u0631\u0627\u06cc \u062c\u0632\u0626\u06cc\u0627\u062a \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u062b\u0627\u0628\u062a \u0647\u0627\u06cc \u062b\u0627\u0628\u062a \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u0634\u0648\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>    public DatabaseMigrationHandler() {\n        this.dbHost = DB_HOST;\n        this.dbPort = DB_PORT;\n        this.dbName = DB_NAME;\n        this.dbSchema = DB_SCHEMA;\n        this.dbUser = DB_USER;\n        this.dbPassword = DB_PASSWORD;\n    }\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u0627\u0632\u0646\u062f\u0647: \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0646\u0645\u0648\u0646\u0647 \u0631\u0627 \u0628\u0627 \u0645\u0642\u0627\u062f\u06cc\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062f\u0631 \u0628\u0627\u0644\u0627 \u0645\u0642\u062f\u0627\u0631\u062f\u0647\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>    private boolean testConnection() {\n        try (Connection connection = getDataSource().getConnection()) {\n            return connection != null;\n        } catch (SQLException e) {\n            e.printStackTrace();\n            return false;\n        }\n    }\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0631\u0648\u0634 testConnection: \u062a\u0644\u0627\u0634 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647.  \u062f\u0631 \u0635\u0648\u0631\u062a \u0645\u0648\u0641\u0642\u06cc\u062a\u060c true \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f\u060c \u062f\u0631 \u063a\u06cc\u0631 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u0627\u0633\u062a\u062b\u0646\u0627 \u0631\u0627 \u062b\u0628\u062a \u0645\u06cc \u06a9\u0646\u062f \u0648 false \u0631\u0627 \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>    private void runMigrations() {\n        try{\n            Flyway flyway = Flyway.configure()\n                    .dataSource(getDataSource())\n                    .schemas(this.dbSchema.  )\n                    .load();\n            flyway.migrate();\n            System.out.println(\"Completed Database migration!\");\n        } catch (Exception e) {\n            System.out.println(\"Database migration failed!\");\n            e.printStackTrace();\n        }\n    }\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0631\u0648\u0634 runMigrations: \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc Flyway \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0648 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u0632 \u06a9\u0644\u0627\u0633 Flyway \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0645\u0646\u0628\u0639 \u062f\u0627\u062f\u0647 \u0648 \u0637\u0631\u062d\u0648\u0627\u0631\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0633\u067e\u0633 \u0641\u0631\u0622\u06cc\u0646\u062f \u0645\u0647\u0627\u062c\u0631\u062a \u0631\u0627 \u0622\u063a\u0627\u0632 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<ul>\n<li>\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u0646\u0628\u0639 \u062f\u0627\u062f\u0647\n<\/li>\n<\/ul>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>    private AwsWrapperDataSource getDataSource() {\n        Properties targetDataSourceProps = new Properties();\n        targetDataSourceProps.setProperty(\"ssl\", \"false\");\n        targetDataSourceProps.setProperty(\"password\", this.dbPassword);\n\n        AwsWrapperDataSource ds = new AwsWrapperDataSource();\n        ds.setJdbcProtocol(\"jdbc:postgresql:\");\n        ds.setTargetDataSourceClassName(\"org.postgresql.ds.PGSimpleDataSource\");\n        ds.setServerName(this.dbHost);\n        ds.setDatabase(this.dbName);\n        ds.setServerPort(this.dbPort);\n        ds.setUser(this.dbUser);\n        ds.setTargetDataSourceProperties(targetDataSourceProps);\n\n        return ds;\n    }\n}\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0631\u0648\u0634 getDataSource: \u0645\u0646\u0628\u0639 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 AwsWrapperDataSource \u0628\u0631\u0627\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 PostgreSQL \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0645\u0627\u0646\u0646\u062f \u0646\u0627\u0645 \u0633\u0631\u0648\u0631\u060c \u0646\u0627\u0645 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647\u060c \u067e\u0648\u0631\u062a\u060c \u06a9\u0627\u0631\u0628\u0631 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>    public static void main(String[] args) {\n        DatabaseMigrationHandler handler = new DatabaseMigrationHandler();\n        if (handler.testConnection()) {\n            System.out.println(\"Database connection successful!\");\n            handler.runMigrations();\n        } else {\n            System.out.println(\"Failed to connect to the database.\");\n        }\n    }\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0631\u0648\u0634 \u0627\u0635\u0644\u06cc: \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0628\u0631\u0646\u0627\u0645\u0647.  \u0627\u06cc\u0646 \u06cc\u06a9 \u0646\u0645\u0648\u0646\u0647 \u0627\u0632 DatabaseMigrationHandler \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f\u060c \u0627\u062a\u0635\u0627\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u062f\u0631 \u0635\u0648\u0631\u062a \u0645\u0648\u0641\u0642\u06cc\u062a \u0622\u0645\u06cc\u0632 \u0628\u0648\u062f\u0646 \u0627\u062a\u0635\u0627\u0644\u060c \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<hr\/>\n<p><strong>\u062a\u0648\u0636\u06cc\u062d build.gradle<\/strong><\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0628\u062e\u0634\u060c \u0641\u0627\u06cc\u0644 build.gradle \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0631\u0627\u06cc \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u0641\u0631\u0622\u06cc\u0646\u062f \u0633\u0627\u062e\u062a \u067e\u0631\u0648\u0698\u0647 \u062c\u0627\u0648\u0627 \u0634\u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.  \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0631\u062e\u06cc \u0627\u0632 \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0645\u0641\u06cc\u062f Gradle \u0631\u0627 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0648 \u0627\u062c\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647 \u0634\u0645\u0627 \u067e\u0648\u0634\u0634 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>plugins {\n    id 'java'\n    id 'groovy'\n    id 'application'\n}\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0641\u0632\u0648\u0646\u0647 application: \u0627\u06cc\u062c\u0627\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u062c\u0627\u0648\u0627 \u0631\u0627 \u062a\u0633\u0647\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0648\u0638\u0627\u06cc\u0641\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>dependencies {\n    implementation 'org.flywaydb:flyway-core:9.22.3'\n    implementation 'org.postgresql:postgresql:42.7.2'\n    implementation 'software.amazon.jdbc:aws-advanced-jdbc-wrapper:2.3.0'\n\n    testImplementation platform('org.junit:junit-bom:5.10.0')\n    testImplementation 'org.junit.jupiter:junit-jupiter'\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc: \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0627\u0639\u0644\u0627\u0645 \u0645\u06cc \u06a9\u0646\u062f.  \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c flyway-core\u060c postgresql\u060c \u0648 aws-advanced-jdbc-wrapper \u06af\u0646\u062c\u0627\u0646\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>application {\n    mainClass=\"com.example.DatabaseMigrationHandler\"\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>mainClass: \u06a9\u0644\u0627\u0633 \u0627\u0635\u0644\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0645\u0634\u062e\u0635 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 com.example.DatabaseMigrationHandler \u0627\u0633\u062a.  \u0627\u06cc\u0646 \u0646\u0642\u0637\u0647 \u0648\u0631\u0648\u062f \u0647\u0646\u06af\u0627\u0645 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a.<\/p>\n<hr\/>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u0641\u0627\u06cc\u0644 build.gradle \u062e\u0648\u062f \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0631\u062f\u06cc\u062f\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0686\u0646\u062f\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 Gradle \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u067e\u0631\u0648\u0698\u0647 \u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.  \u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631\u0627\u062a \u0627\u0632 \u062e\u0637 \u0641\u0631\u0645\u0627\u0646 \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>.\/gradlew clean\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>clean: \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0633\u0627\u062e\u062a \u0631\u0627 \u062d\u0630\u0641 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0648\u062b\u0631 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062a\u0645\u06cc\u0632 \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u06cc\u0646 \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0633\u0627\u062e\u062a \u062a\u0627\u0632\u0647 \u0645\u0641\u06cc\u062f \u0627\u0633\u062a.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>.\/gradlew build\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>build: \u06a9\u062f \u0645\u0646\u0628\u0639 \u0631\u0627 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0622\u0632\u0645\u0627\u06cc\u0634 \u0647\u0627 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 JAR \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0645\u06cc \u06a9\u0646\u062f.  \u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u062a\u0645\u0627\u0645 \u0645\u0631\u0627\u062d\u0644 \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0622\u0631\u062a\u06cc\u0641\u06a9\u062a \u0633\u0627\u062e\u062a \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>.\/gradlew run\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>run: \u06a9\u0644\u0627\u0633 \u0627\u0635\u0644\u06cc \u0645\u0634\u062e\u0635 \u0634\u062f\u0647 \u062f\u0631 \u0642\u0633\u0645\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f.  \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f\u060c com.example.DatabaseMigrationHandler \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc Flyway \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u062f\u0631 \u0644\u0627\u06af \u0647\u0627 \u0628\u0627\u06cc\u062f \u0628\u0628\u06cc\u0646\u06cc\u062f \u06a9\u0647 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 DB \u0628\u0631\u0642\u0631\u0627\u0631 \u0634\u062f \u0648 \u0645\u0647\u0627\u062c\u0631\u062a \u0647\u0627\u06cc DB \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u0627\u062c\u0631\u0627 \u0634\u062f.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0gowkqdscmc6x8ek5lg.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"800\" height=\"370\" title=\"\"><\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u062c\u0631\u0627\u06cc \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc\u200c\u0647\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 SQL \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f: \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0633\u062a\u0648\u0646\u200c\u0647\u0627\u06cc \u062c\u062f\u0648\u0644\u060c \u0627\u0641\u0632\u0648\u062f\u0646 \u0631\u062f\u06cc\u0641\u200c\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f\u060c \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0637\u0631\u062d \u062c\u062f\u06cc\u062f \u0648 \u063a\u06cc\u0631\u0647. \u0627\u063a\u0644\u0628 \u062a\u06cc\u0645\u200c\u0647\u0627\u06cc \u062a\u0648\u0633\u0639\u0647\u200c\u062f\u0647\u0646\u062f\u0647 \u0627\u0632 Flyway \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f. \u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0646\u0628\u0639 \u0628\u0627\u0632 SQL \u0627\u0633\u062a. \u062f\u0631 Flyway \u0628\u0647 \u062a\u0645\u0627\u0645 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a DDL \u0648 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":68424,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-68423","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/68423","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=68423"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/68423\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/68424"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=68423"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=68423"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=68423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}