如果在运行 Spring Boot 应用程序时不存在 Postgres 数据库,则创建它

Ahm*_*tfy 7 postgresql spring spring-data spring-boot

我正在使用PostgreSQL并且spring-boot-2.0.1希望我的应用程序创建数据库(如果它不存在)。我有以下选项application.properties

spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL94Dialect

spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=postgres
spring.datasource.password=123
Run Code Online (Sandbox Code Playgroud)

上面我收到错误:

Caused by: org.postgresql.util.PSQLException: FATAL: database "mydb" does not exist
Run Code Online (Sandbox Code Playgroud)

知道我错过了什么吗?

ISl*_*ani 6

如果数据库不存在,您可以创建一个数据库 spring boot

至少mysql我们这样做:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb?createDatabaseIfNotExist=true
Run Code Online (Sandbox Code Playgroud)

所以它应该与 postgresql

spring.datasource.url= jdbc:postgresql://localhost:5432/mydb?createDatabaseIfNotExist=true
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,但这不适用于 postgres。它只适用于 mysql (25认同)
  • 如前所述,此解决方案不适用于 Postgres。 (2认同)
  • 不幸的是,createDatabaseIfNotExist 不适用于 postgres。 (2认同)

Mar*_*nik 4

由于所有 Postgres 安装都带有默认数据库,从技术上讲,应该可以在一开始(应用程序启动时)连接到它,然后调用

创建数据库

这是您可以在 spring 初始化之前但在读取属性之后以编程方式执行的操作,例如在环境后处理器中

之所以需要这么早的调用,是因为一方面您可能想利用 Spring Boot 读取的属性,但到了 Spring Boot bean 将开始获取处于“操作”状态的新创建的数据库。

所以,从技术上来说是可能的。但是,我看不到此场景的真正用例。如果是为了测试,那么你可以完美地使用默认的 Postgres 数据库,这在问题一开始就提到了。

如果是用于生产环境 - 通常 DBA 不会允许这样做,因为为了能够运行该CREATE DATABASE语句,连接到 Postgres(本例中为 Spring Boot 应用程序)的用户应该具有非常“强”的createb权限,例如DBA 并不真正愿意分享。