Создайте базу данных (например, Flyway или другую), прежде чем наступит спящий режим - PullRequest
2 голосов
/ 30 апреля 2019

Я использую Spring и Hibernate и хочу создать базу данных до того, как Hibernate вступит в действие, в противном случае я получаю Причина: org.postgresql.util.PSQLException: FATAL: база данных "db" не существует.

У меня есть это в моем файле свойств:

spring.datasource.url=jdbc:postgresql://postgres:5432/db
spring.datasource.username=username
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
server.port=3001

db не существует в базе данных postgres, поэтому он выдает исключение.

Некоторые люди говорят, что я могу использовать Flyway:

Создание базы данных PostgreSQL на лету с использованием Hibernate, даже если БД не существует

Другие говорят, что это невозможно:

Как создать базу данных с помощью flyway?

Как я могу выполнить создание БД с помощью flyway?
Или, если он используется только для миграций после создания, как я могу создать bean-компонент инициализации (вы можете показать мне некоторый код), который запускается раньше, как указано в принятом ответе здесь:

Создание базы данных PostgreSQL на лету с использованием Hibernate, даже если БД не существует

И начать использовать flyway для миграций (первые таблицы и т. Д.) ...

После этого я мог переключить ddl-auto на none.

Каким будет поток?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Spring поддерживает выполнение flyway и / или liquibase при запуске (да, даже до того, как ваш уровень ORM попытается подключиться к нему) :

Чтобы автоматически запустить миграцию базы данных Flyway при запуске, добавьте org.flywaydb: основной путь вашего класса.

Миграции - это скрипты в форме V [VERSION] __ [NAME] .sql (с версия с подчеркиванием, например, «1» или «2_1»). От по умолчанию они находятся в папке с именем classpath: db /igration, но вы можете изменить это местоположение, установив spring.flyway.locations. Это разделенный запятыми список одного или нескольких classpath: или файловой системы: местах. Например, следующая конфигурация будет искать скрипты в расположении пути к классу по умолчанию и в / opt / миграции каталог

источник:

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html#howto-execute-flyway-database-migrations-on-startup

пожалуйста, прочитайте руководство.

Также: вы можете (конечно) даже выполнять операторы вроде CREATE DATABASE, для этого вам просто нужно отдельное соединение: Как создать базу данных с помощью flyway?

Некоторые драйверы JDBC даже позволяют полностью пропустить этот шаг: https://stackoverflow.com/a/34379819/351861

0 голосов
/ 30 апреля 2019

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 происходит следующее:

  1. Spring создает подключение базы данных к вашей базе данных.
  2. Flyway проверяет, требуется ли миграция, и если да, то применяет сценарии миграции.
  3. Hibernate проверяет схему базы данных по классам сущностей JPA и выдает исключение, если они не синхронизированы..

Так мы осуществляем миграцию баз данных с помощью Flyway, Spring и Docker.Надеюсь это поможет.Удачи.

...