Создайте базу данных 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