Issue
I'm using PostgreSQL
and spring-boot-2.0.1
and want my app to create the database if it doesn't exist.
I have the below options in my 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
with the above i'm getting error:
Caused by: org.postgresql.util.PSQLException: FATAL: database "mydb" does not exist
any idea what i'm missing?
Solution
Since all Postgres installations come with a default database, technically it should be possible to connect to it at the very beginning (when the application starts) and then to call
This is something you could do programmatically before spring initializes, but after the properties are read, for example in Environment Post Processor
The so-early invocation is required because you probably want to take advantage of the properties read by spring boot on one hand, but by the time the spring boot beans will start to get the newly created database in the "operational" state.
So, technically its possible. However, I can't see a real use-case for this scenario. If it's for tests, then you can perfectly use the default Postgres database, that was mentioned in the very beginning of the question.
If it's for production environment - usually DBAs won't allow that, because in order to be able to run that CREATE DATABASE
statement, the user that connects to Postgres (spring boot application in this case) should have a very "strong" createdb priviledge, something that DBA won't really want to share.
Answered By - Mark Bramnik
Answer Checked By - Marilyn (JavaFixing Volunteer)