Как создавать динамически БД PostgerSQL при исполнении исходного кода на Java, Hibernate?
Получил первое в жизни тестовое задание на работу, в котором надо сделать рестфул сервис. Одно из требований звучит так: "Приложение должно собираться при помощи maven без установки или настройки каких либо дополнительных компонент;" Я писал свое ентерпрайс приложение до этого, но саму базу данных создавал вручную через pgAdmin, а вот исходниками запускал скрипт, который создавал таблицы по типу:
DROP TABLE IF EXISTS buildings CASCADE;
Теперь же, как я понимаю, мне надо сделать так, чтобы при запуске проекта у проверяющего мое задание база как-то создалась сама или может требуется вообще что-то другое, типо удаленное базы данных. Я не уверен, так как опять же раньше тестовое задание никогда не делал. Подскажите, пожалуйста, кто поопытнее младшему товарищу)
Ответы (2 шт):
Flyway тут в помощь. Со спрингом будет еще удобнее, чем с нативной Java ee.
Как пример:
В файле миграции V1_1__Create_tables.sql прописываем скрипт на создание нужных нам таблиц:
create sequence if not exists hibernate_sequence start 10 increment 1; -- Создание sequenc'а для генерации id.
create table buildings
(
id int8 not null unique,
-- Остальные нужные поля
primary key (id)
);
application.properties:
spring.jpa.generate-ddl=false
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=validate
ДД! Можно вот так:
public static void main(String[] args) {
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres","su", "ТУТ ПАРОЛЬ su!");
Statement statement = connection.createStatement();
statement.execute("CREATE DATABASE testdb"); //создает бд
connection.close();
connection =
DriverManager.getConnection("jdbc:postgresql://localhost:5432/testdb","su", "ТУТ ПАРОЛЬ!");
statement = connection.createStatement();
statement.execute("CREATE TABLE test(did INTEGER, dname VARCHAR(20))"); //создает таблицу
statement.execute("INSERT INTO test(did,dname) VALUES(1,'testname')"); //добавляет в таблицу
ResultSet rs = statement.executeQuery("SELECT * FROM test");
while(rs.next()){
System.out.println(rs.getInt("did")+" "+rs.getString("dname")); //проверяем, что в таблице
}
statement.close();
System.out.println("+");
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
ВАЖНО: Сначала вы подключаетесь к служебной базе postgres