我正在使用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切换为无。
会怎样?
答案 0 :(得分:0)
TL; DR:问题是您的空数据库db
需要存在。为什么会这样?
在您的示例中,您告诉Spring创建一个DataSource
至jdbc:postgresql://postgres:5432/db
。这意味着您现在正在尝试连接到一个不存在的数据库服务器和一个名为db
的特定数据库。
流就是你
更新
据我了解,您正在使用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应用程序启动时,会发生以下情况:
这就是我们使用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中的脚本 目录
源:
请阅读手册。
也:您当然可以执行CREATE DATABASE
之类的语句,为此您只需要一个单独的连接即可:How to create a database with flyway?
某些JDBC驱动程序甚至允许完全跳过该步骤:https://stackoverflow.com/a/34379819/351861