在休眠进入之前创建数据库(例如Flyway或其他数据库)

时间:2019-04-30 10:20:18

标签: java spring postgresql hibernate flyway

我正在使用Spring和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:

Create PostgreSQL database on the fly using Hibernate even if the DB doesn't exist

其他人说这是不可能的:

How to create a database with flyway?

如何用flyway完成数据库的创建?
或者,如果仅将其用于创建后的迁移,那么如何创建初始化bean(您可以向我展示一些代码),该初始化bean如此处接受的答案所述:

Create PostgreSQL database on the fly using Hibernate even if the DB doesn't exist

然后开始使用flyway进行迁移(第一个表等)...

之后,我可以将ddl-auto切换为无。

会怎样?

2 个答案:

答案 0 :(得分:0)

TL; DR:问题是您的空数据库db需要存在。为什么会这样?

在您的示例中,您告诉Spring创建一个DataSourcejdbc:postgresql://postgres:5432/db。这意味着您现在正在尝试连接到一个不存在的数据库服务器和一个名为db的特定数据库。

流就是你

  • 首先确保要连接的空数据库始终存在。是必填项。
  • 之后,您可以运行您的应用程序,并且Flyway可以在Hibernate开始验证数据库架构之前进行迁移。

更新

据我了解,您正在使用Docker。那很棒。

鉴于以下docker-compose.yml,我们声明了两个图像。

  • db是运行PostgresDB的容器
  • app是运行您的Spring(启动)应用程序的容器。

通过声明环境变量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开始,该脚本包含JPA实体的所有CREATE TABLE语句。 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进行数据库迁移的方式。希望这可以帮助。祝你好运。

答案 1 :(得分:-1)

Spring在启动时支持飞行和/或liquibase执行(是的,甚至在您的ORM层尝试与其连接之前)

  

要在启动时自动运行Flyway数据库迁移,请添加   org.flywaydb:flyway-core到您的类路径。

     

迁移是格式为V [VERSION] __ [NAME] .sql(带有    下划线分隔的版本,例如“ 1”或“ 2_1”)。通过   默认情况下,它们位于名为classpath:db / migration的文件夹中,但是您   可以通过设置spring.flyway.locations来修改该位置。这是一个   一个或多个类路径:或文件系统的逗号分隔列表:   位置。例如,以下配置将搜索   默认类路径位置和/ opt / migration中的脚本   目录

源:

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

请阅读手册。

也:您当然可以执行CREATE DATABASE之类的语句,为此您只需要一个单独的连接即可:How to create a database with flyway?

某些JDBC驱动程序甚至允许完全跳过该步骤:https://stackoverflow.com/a/34379819/351861