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

问题描述 投票:2回答:2

我正在使用Spring和Hibernate,我希望在hibernate启动之前创建一个数据库,否则我得到一个引发者:org.postgresql.util.PSQLException:致命:数据库“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

postgres数据库中不存在db,因此它会抛出异常。

有人说我可以使用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(可以显示一些代码),如之前所接受的答案中所述:

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

并开始使用flyway进行迁移(第一张桌子等)......

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

流量会是什么?

java spring postgresql hibernate flyway
2个回答
0
投票

TL; DR:事情是你的空数据库db需要存在。这是为什么?

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

流程就是你

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

UPDATE

据我所知,你正在使用Docker。那很棒。

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

  • qazxsw poop是运行Postgres DB的容器
  • db是运行Spring(Boot)应用程序的容器。

通过声明环境变量app,您可以告诉Postgres在启动时创建一个空数据库并使用env vars名称。

POSTGRES_DB

在Spring Boot应用程序中,您可以启用Flyway支持并将数据库脚本放在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 下。我通常从一个包含我的JPA实体的所有CREATE TABLE语句的迁移脚本classpath:db/migration开始。当Spring成功连接到数据库时,将在启动时执行此脚本。

V0_0_1__Initial.sql

请确保我已将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,因为我们没有Hibernate来修改数据库模式,但是当模式与您的实体不同步时它应该验证并中止。

因此当您的Spring应用程序启动时会发生以下情况

  1. Spring创建与数据库的数据库连接。
  2. Flyway检查是否需要迁移,如果是,则应用迁移脚本。
  3. Hibernate根据JPA实体类验证数据库模式,如果它们不同步则会抛出异常。

这就是我们使用Flyway,Spring和Docker进行数据库迁移的方法。希望这可以帮助。祝好运。


-1
投票

Spring在启动时支持flyway和/或liquibase执行(是的,甚至在你的ORM层尝试连接它之前):

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

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

资源 :

validate

请阅读手册。

另外:你可以(当然)甚至执行像https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html#howto-execute-flyway-database-migrations-on-startup这样的语句,你只需要一个单独的连接:CREATE DATABASE

一些JDBC驱动程序甚至允许完全跳过该步骤:How to create a database with flyway?

© www.soinside.com 2019 - 2024. All rights reserved.