Java 在hibernate启动之前创建数据库(如Flyway或其他)

Java 在hibernate启动之前创建数据库(如Flyway或其他),java,spring,postgresql,hibernate,flyway,Java,Spring,Postgresql,Hibernate,Flyway,我使用的是Spring和Hibernate,我想在Hibernate启动之前创建一个数据库,否则我会得到一个由以下原因引起的错误:org.postgresql.util.psqleException:FATAL:数据库“db”不存在 我的属性文件中有以下内容: spring.datasource.url=jdbc:postgresql://postgres:5432/db spring.datasource.username=username spring.datasource.password

我使用的是Spring和Hibernate,我想在Hibernate启动之前创建一个数据库,否则我会得到一个由以下原因引起的错误:org.postgresql.util.psqleException: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
数据库在postgres数据库中不存在,因此它引发异常

有人说我可以使用Flyway:

其他人说这是不可能的:

如何使用flyway创建db?
或者,如果它仅用于创建后的迁移,我如何才能创建之前运行的初始化bean(您能否向我展示一些代码),如此处接受的答案中所述:

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

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


流程是什么?

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

在您的示例中,您告诉Spring创建一个
DataSource
jdbc: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.jpa.hibernate.ddl auto
设置为
validate
,因为我们不需要hibernate修改数据库架构,但当架构与实体不同步时,它应该进行验证并中止

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

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

  • 这就是我们使用Flyway、Spring和Docker进行数据库迁移的方式。希望这有帮助。祝你好运。

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

    要在启动时自动运行Flyway数据库迁移,请添加 flywaydb:flyway核心到类路径

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

    资料来源:

    请阅读手册

    另外:您(当然)甚至可以执行
    CREATE DATABASE
    之类的语句,您只需要一个单独的连接即可:


    一些JDBC驱动程序甚至允许完全跳过这一步:

    Ok。但是如果数据库不存在,我想通过代码创建它。我在春天的可能性是什么?你能帮我吗?我的想法是在spring打开与db的连接之前创建db。但是我找不到我应该在哪里做这件事。你应该使用数据库工具(pgadmin、psql、datagrip…)来做这件事。在应用程序启动时创建数据库是没有意义的,除非您计划使用它或测试或类似的东西,但在这种情况下,您应该签出testcontainers之类的东西。@cyp的问题是,您不应该使用使用数据库的应用程序创建数据库。没有人这样做。这不是一个好的设计。@从堆栈溢出中的其他问题来看,我认为您不应该在生产中使用ddl auto和hbm2ddl.auto create。顺便说一句,当我说创建数据库时,它不是模式和表,而是实际的数据库,然后将其放入数据源url中。在flyway中,据我所知,您不能发出创建数据库db,因为flyway需要连接到已创建的数据库。它只涉及到迁移(表创建等)。我实际上读过它,但从手册中我无法理解我是否能够真正创建数据库(“创建数据库db”)?是的,这正是数据库迁移工具(如flyway和liquibase)的目的,只需确保包含相应的statement@specializt在
    jdbc:p上进行数据库迁移ostgresql://postgres:5432/db
    db
    不存在时,不工作。正如@cyp所解释的,这件事将以
    org.postgresql.util.PSQLException:FATAL:数据库“db”不存在而告终
    错误。当应用程序无法连接到数据库时,它实际上没有机会对其应用任何SQL语句是的。无法联系不存在的数据库服务器。有点明显。
    spring.datasource.url=jdbc:postgresql://db:5432/myDB
    spring.datasource.username=myUser
    spring.datasource.password=myPassword
    spring.jpa.hibernate.ddl-auto=validate