Создайте базу данных Postgres, если она не существует при запуске весеннего загрузочного приложения

Я использую 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

с вышеупомянутым я получаю ошибку:

Caused by: org.postgresql.util.PSQLException: FATAL: database "mydb" does not exist

Есть идеи, что мне не хватает?

5 ответов

Решение

Поскольку все установки Postgres поставляются с базой данных по умолчанию, технически должна быть возможность подключиться к ней в самом начале (при запуске приложения), а затем вызвать

СОЗДАТЬ БАЗУ ДАННЫХ

Это то, что вы могли бы сделать программно до инициализации Spring, но после чтения свойств, например, в среде Post Processor.

Такой ранний вызов необходим, потому что вы, вероятно, хотите воспользоваться преимуществами свойств, считываемых пружинной загрузкой, с одной стороны, но к тому времени, как бины пружинной загрузки начнут переводить вновь созданную базу данных в "рабочее" состояние.

Итак, технически это возможно. Тем не менее, я не вижу реального варианта использования для этого сценария. Если это для тестов, то вы можете прекрасно использовать базу данных Postgres по умолчанию, которая была упомянута в самом начале вопроса.

Если это для производственной среды - обычно администраторы базы данных не позволяют этого, потому что для того, чтобы иметь возможность запустить это CREATE DATABASE Утверждается, что пользователь, который подключается к Postgres (в данном случае, к приложению с весенней загрузкой), должен иметь очень "сильную" привилегию createb, которой администратор базы данных не захочет делиться.

Вы можете создать базу данных, если она не существует с spring boot

По крайней мере с mysql мы делаем:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb?createDatabaseIfNotExist=true

Так должно быть и с postgresql

spring.datasource.url= jdbc:postgresql://localhost:5432/mydb?createDatabaseIfNotExist=true

Весенний ботинок

Постгрес не поддерживаетcreateDatabaseIfNotExist=trueТаким образом, вы можете попробовать аналогичный способ, и он работал у меня, см. Скриншот

      @SpringBootApplication
public class SpringSecurityJwtApplication{

    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(SpringSecurityJwtApplication.class);
        Connection connection = null;
        Statement statement = null;
        try {
            logger.debug("Creating database if not exist...");
            connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/", "postgres", "postgres");
            statement = connection.createStatement();
            statement.executeQuery("SELECT count(*) FROM pg_database WHERE datname = 'database_name'");
            ResultSet resultSet = statement.getResultSet();
            resultSet.next();
            int count = resultSet.getInt(1);

            if (count <= 0) {
                statement.executeUpdate("CREATE DATABASE database_name");
                logger.debug("Database created.");
            } else {
                logger.debug("Database already exist.");
            }
        } catch (SQLException e) {
            logger.error(e.toString());
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                    logger.debug("Closed Statement.");
                }
                if (connection != null) {
                    logger.debug("Closed Connection.");
                    connection.close();
                }
            } catch (SQLException e) {
                logger.error(e.toString());
            }
        }
        SpringApplication.run(SpringSecurityJwtApplication.class, args);
    }
}

Решением было бы добавить скрипт для создания базы данных... хотя в postgres нет слова «если не существует». Вот как я решил проблему с файлом Docker, но я думаю, вы можете выполнить сценарий sql в Postgres. Я поместил это в initdb.sh...

      set -e
export PGPASSWORD=$POSTGRES_PASSWORD;
psql -v ON_ERROR_STOP=1 --username "root" --dbname "mydb" <<-EOSQL
  SELECT 'CREATE DATABASE mydb' WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'mydb')\gexec
  GRANT ALL PRIVILEGES ON DATABASE mydb TO root;
  \connect mydb root
EOSQL

Короткий ответ:

Это невозможно сделать так, как мы делаем в MySQL вам нужно найти способ сделать это самостоятельно из Spring Configuration

Другие вопросы по тегам