TL; DR: Дело в том, что ваша пустая база данных db
должна существовать.Почему это так?
В вашем примере вы говорите Spring создать DataSource
до jdbc:postgresql://postgres:5432/db
.Это означает, что вы сейчас пытаетесь подключиться к серверу базы данных и конкретной базе данных с именем db
, которая не существует.
Поток состоит в том, что вы
- сначала убедитесь, чтопустая база данных, к которой вы пытаетесь подключиться, всегда существует.Требуется.
- После этого вы можете запустить свое приложение, и Flyway может выполнить миграцию до того, как Hibernate начнет проверять схему базы данных.
ОБНОВЛЕНИЕ
Насколько я понимаю, вы работаете с Docker.Замечательно.
Учитывая следующее docker-compose.yml
, мы объявляем два изображения.
db
, который является контейнером, на котором работает PostgresDB app
, который является контейнеромкоторый запускает ваше приложение Spring (Boot).
Объявляя переменную среды POSTGRES_DB
, вы можете указать Postgres создать пустую базу данных при запуске и использовать имя env vars.
version: '3.5'
services:
db:
image: postgres:11.2-alpine
restart: always
environment:
POSTGRES_DB: myDB
POSTGRES_PASSWORD: myPassword
POSTGRES_USER: myUser
app:
image: <your/spring-boot-image>
restart: always
ports:
- 8080:8080
В приложении Spring Boot вы можете включить поддержку Flyway и поместить сценарии базы данных в classpath:db/migration
.Я обычно начинаю с одного сценария миграции V0_0_1__Initial.sql
, который содержит все операторы CREATE TABLE моих сущностей JPA.Эти сценарии будут выполняться при запуске, когда Spring успешно подключится к базе данных.
spring.datasource.url=jdbc:postgresql://db:5432/myDB
spring.datasource.username=myUser
spring.datasource.password=myPassword
spring.jpa.hibernate.ddl-auto=validate
Пожалуйста, убедитесь, что я установил spring.jpa.hibernate.ddl-auto
в validate
, так как мы не используем Hibernate для изменения схемы базы данных.но он должен проверять и прерывать работу, когда схема не синхронизирована с вашими сущностями.
Поэтому при запуске приложений Spring происходит следующее:
- Spring создает подключение базы данных к вашей базе данных.
- Flyway проверяет, требуется ли миграция, и если да, то применяет сценарии миграции.
- Hibernate проверяет схему базы данных по классам сущностей JPA и выдает исключение, если они не синхронизированы..
Так мы осуществляем миграцию баз данных с помощью Flyway, Spring и Docker.Надеюсь это поможет.Удачи.